首页 > 解决方案 > 如何在 python 中获得更好的随机数?

问题描述

为了测试python生成的数字有多随机,我写了这个:

import random

l=[]
lshuf=[]
for x in range(0,101):
    lshuf.append(x)

for x in range (0,100000):
    l.append(lshuf[random.randrange(0,101)])
   
    
l2=[]
for x in range(0,101):
    l2.append(0)

for x in l:
    l2[l[x]]+=1

基本上它会生成 0 到 100 之间的 100,000 个随机数,并将 0 到 100 之间的数字出现在列表中的次数。当它打印出一个列表时,显示如下:

[0, 947, 2018, 1961, 0, 990, 1994, 0, 934, 0, 0, 976, 0, 0, 967, 1024, 2025, 2009, 2990, 949, 0, 4961, 0, 0, 1037, 951, 1998, 0, 2002, 3076, 0, 0, 0, 2086, 0, 2926, 0, 936, 996, 0, 995, 1010, 0, 0, 1004, 0, 0, 0, 0, 0, 1004, 0, 2909, 1990, 1955, 4833, 0, 1001, 0, 0, 0, 0, 2928, 0, 1976, 1018, 0, 1985, 996, 958, 3005, 0, 1918, 988, 976, 0, 3057, 0, 1010, 988, 0, 1860, 1026, 0, 945, 0, 0, 0, 1988, 999, 1871, 1034, 2976, 1010, 0, 1994, 0, 0, 983, 3026, 1031]

如果它真的是随机的,那么所有项目都不会出现零,它们大多在 500 到 1500 之间。我怎样才能生成更好的随机数?

标签: pythonrandom

解决方案


你的测试不正确。

for x in l:
    l2[l[x]]+=1

应该:

for x in l:
    l2[x]+=1

l[x]仅从您的 100,000 个号码中的前 100 个中抽取样本。

这是一个简化的测试:

import random
from collections import Counter

c = Counter()
for _ in range(100000):
    c[random.randrange(101)] += 1
result = dict(sorted(c.items()))

# >>> print(result)
# {0: 936, 1: 1011, 2: 989, 3: 1005, 4: 1036, 5: 992, 6: 1013, 7: 1008, 8: 983, 9: 987, 10: 982, 11: 991, 12: 986, 13: 973, 14: 973, 15: 988, 16: 952, 17: 1025, 18: 958, 19: 989, 20: 984, 21: 934, 22: 997, 23: 960, 24: 989, 25: 1005, 26: 1006, 27: 1019, 28: 1000, 29: 1003, 30: 1007, 31: 993, 32: 996, 33: 993, 34: 1010, 35: 1041, 36: 955, 37: 965, 38: 991, 39: 995, 40: 1036, 41: 967, 42: 1013, 43: 957, 44: 930, 45: 1037, 46: 1031, 47: 1017, 48: 1050, 49: 1005, 50: 954, 51: 968, 52: 1010, 53: 984, 54: 1012, 55: 1017, 56: 980, 57: 928, 58: 976, 59: 968, 60: 970, 61: 1011, 62: 949, 63: 1018, 64: 982, 65: 990, 66: 1011, 67: 985, 68: 1001, 69: 964, 70: 957, 71: 977, 72: 1007, 73: 1028, 74: 1049, 75: 930, 76: 949, 77: 998, 78: 981, 79: 1001, 80: 1000, 81: 976, 82: 1064, 83: 994, 84: 993, 85: 999, 86: 1007, 87: 1021, 88: 958, 89: 957, 90: 989, 91: 990, 92: 990, 93: 992, 94: 1027, 95: 973, 96: 907, 97: 973, 98: 944, 99: 979, 100: 1049}

推荐阅读