随机 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
如何更改代码以获得所需的结果?
用 50 个 0 和 50 个 1 创建 numbers
,
>>> numbers = [0, 1] * 50
-
>>> from random import shuffle
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))
我想迭代 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
如何更改代码以获得所需的结果?
用 50 个 0 和 50 个 1 创建
numbers
,>>> numbers = [0, 1] * 50
-
>>> from random import shuffle
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))