Python 随机选择0或1次相同的次数?
我想迭代100个值,然后随机选择0或1,但结果是0和1的数量相等 下面的代码打印计数:Python 随机选择0或1次相同的次数?,python,random,Python,Random,我想迭代100个值,然后随机选择0或1,但结果是0和1的数量相等 下面的代码打印计数: import random c_true = 0 c_false = 0 for i in range(100): a = random.getrandbits(1) if a == 1: c_true += 1 else: c_false += 1 print "true_count:",c_true print "false_count:",c_
import random
c_true = 0
c_false = 0
for i in range(100):
a = random.getrandbits(1)
if a == 1:
c_true += 1
else:
c_false += 1
print "true_count:",c_true
print "false_count:",c_false
输出为:
true_count: 56
false_count: 44
我希望计数相等
true_count: 50
false_count: 50
如何更改代码以获得所需的结果
>>> numbers = [0, 1] * 50
shuffle
>>> shuffle(numbers)
注意:
shuffle
在适当的位置对列表进行洗牌。因此,数字现在将被洗牌。那么它不是真正随机的,但是如果你想以50个1和50个0结束,那么根据剩余的可用位置使用权重。例如,在40 1s和45 0s时,0的概率应为5/15,1的概率应为10/15。下面是一个基于生成器的解决方案,它使用O(1)内存:
虽然这满足OP的约束,即so+1,但它不能在所有可能的序列上给出均匀分布,因此可能不适合于某些目的。@DSM:这让我想知道是否有一种已知的O(1)算法可以在所有序列上给出均匀分布?我想使用(random.random()>=1.0*false\u count/(true\u count+false\u count))
。@DSM:它看起来确实像(根据经验,通过我刚刚做的一点蒙特卡罗模拟)。谢谢。这是一个有偏差的算法,因为它很可能以一个长的0或1序列结尾。我最初认为它也是不确定的,但在50个零或1之后,生成另一个值的概率将是100%,所以情况并非如此。是的,它是基于剩余值的偏差,这就是为什么它不是随机的。如果你有一篮100个球(50个1,50个0),那么它在现实世界中是如何工作的。你不能要求完全无偏的随机性,但要增加一个先决条件,即结果应该被分成50%。这两件事是不相容的。我很确定这个问题的三个答案在逻辑上是相同的。
>>> shuffle(numbers)
import random
def gen_boolean_seq(true_count, false_count):
while true_count or false_count:
val = (random.random() >= false_count / float(true_count + false_count))
if val:
true_count -= 1
else:
false_count -= 1
yield val
print sum(gen_boolean_seq(50, 50))