随机 select 0 或 1 相等的次数?

Randomly select 0 or 1 equal number of times?

我想迭代 100 个值和 select 随机 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

如何更改代码以获得所需的结果?

  1. 用 50 个 0 和 50 个 1 创建 numbers

    >>> numbers = [0, 1] * 50
    
  2. 导入shuffle from random

    >>> from random import shuffle
    
  3. shuffle 他们

    >>> shuffle(numbers)
    

注意: shuffle 就地打乱列表。因此,numbers 现在将被洗牌。

那么它并不是真正随机的,但如果您想以 50 个 1 和 50 个 0 结束,则根据剩余的可用位置使用权重。例如。 40个1和45个0,0的几率应该是5/15,1的几率应该是10/15.

这是一个使用 O(1) 内存的基于生成器的解决方案:

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