Python 随机选择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_

我想迭代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_false
输出为:

true_count: 56
false_count: 44
我希望计数相等

true_count: 50
false_count: 50
如何更改代码以获得所需的结果

  • 创建带有50个0和50个1的编号

    >>> 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))