如何生成1的数量呈均匀分布的Python随机二进制列表?
实现1的数量均匀分布的随机二进制列表
原来的代码之所以呈现钟形(二项)分布,是因为每个元素独立生成0/1,这本质上是重复n次伯努利试验,结果自然是二项分布——中间的k值(1的数量)概率最高,两端最低。要让每个k的出现概率一致,我们可以换个思路:
- 第一步:均匀随机选择1的数量k,k的取值范围是0到n(包含两端),每个k被选中的概率相等
- 第二步:在n个位置里随机挑选k个位置设为1,剩下的位置设为0,这样每个包含恰好k个1的二进制列表都是等概率生成的,不会破坏随机性
具体实现代码
import random def rand_binary_list_uniform(n): # 均匀选择1的数量k k = random.randint(0, n) # 生成包含k个1和n-k个0的列表,再随机打乱 binary_list = [1]*k + [0]*(n - k) random.shuffle(binary_list) return binary_list
验证分布是否均匀
我们用和你类似的统计代码来验证效果:
counts = {i:0 for i in range(11)} for _ in range(10000): lst = rand_binary_list_uniform(10) k = sum(lst) counts[k] += 1 # 打印统计结果 for k in counts: print(f"1的数量为{k}: {counts[k]}次")
运行后你会看到每个k对应的计数都接近900-1000左右(10000次试验,11个可能的k值,平均每个约909次),比如可能得到类似这样的结果:
1的数量为0: 921次
1的数量为1: 895次
1的数量为2: 910次
1的数量为3: 902次
1的数量为4: 915次
1的数量为5: 887次
1的数量为6: 908次
1的数量为7: 923次
1的数量为8: 901次
1的数量为9: 917次
1的数量为10: 921次
这样就实现了你要的1的数量均匀分布,同时每个符合条件的二进制序列都是随机生成的,完全保留了随机性。
内容的提问来源于stack exchange,提问作者MetaStack
相关产品推荐
相关产品推荐

