Possible Duplicates:
Random weighted choice
Generate random numbers with a given (numerical) distribution
我有一个列表,其中包含一系列的数字和相关的概率。
prob_list = [[1, 0.5], [2, 0.25], [3, 0.05], [4, 0.01], [5, 0.09], [6, 0.1]]
例如,在prob_list[0]
中,数字1的关联概率为0.5。所以你希望1在50%的时间里出现。
当我选择这些数字时,我如何增加它们的权重?
注意:列表中的数字可以在6-100之间变化
编辑
在列表中,我有6个数字及其相关概率。我想根据概率选择两个数字。
不能选择两次号码。如果选择“2”,则不能再次选择。
这里有一些东西似乎可以工作并满足您的所有规范(主观上看起来很快)。请注意,第二个数与第一个数不相同的约束会抛出选择它的概率。下面的代码实际上忽略了这个问题,它只是强制执行了限制(换句话说,第二个数字的概率不会是为
prob_list
中的每个数字给定的概率)。我假设所有的概率加起来都是1。如果他们不这样做,你就必须相应地调整他们的规模,这样他们才能做到。
首先使用
random.random()
生成一个均匀的随机变量[0,1]。然后通读一下这个清单,把概率加起来。第一次总和超过随机数时,返回关联的数字。这样,如果生成的均匀随机变量在示例中的范围(0.5,0.75)内,则返回2,从而使其返回所需的0.25概率。下面的测试表明它是有效的:
哪些输出:
编辑:刚刚看到问题中的编辑。如果要选择两个不同的数字,可以重复上述步骤,直到选择的第二个数字是不同的。但是如果一个数字有很高的概率(例如0.9999999)与之相关,这将是非常缓慢的。在这种情况下,您可以从列表中删除第一个数字,然后重新调整概率,以便在选择第二个数字之前,它们的总和为1。
这可能就是你要找的。对Generate random numbers with a given (numerical) distribution中的解决方案的扩展。从分发中删除选定项,更新概率并返回
selected item, updated distribution
。没有证明有效,但应该给人一个好印象的想法。相关问题 更多 >
编程相关推荐