如何在Python中生成多个随机数到足够的“随机”程度

问题描述:

我希望这个问题具有足够的问题值得关注,并且我没有错过这一点。我知道有可能有多个答案 - 我会标记出我得到的最好答案,但如果这不是一个好问题,那么请说,我会酌情删除。如何在Python中生成多个随机数到足够的“随机”程度

如果我使用的是需要大量(多于一个)随机数的Python脚本,例如

from random import randrange 

number1 = randrange(10) 
number2 = randrange(10) 
number3 = randrange(10) 

print number1, number2, number3 

...那么是randrange最好的办法吗?具体来说,它究竟是多么随意?我觉得我发现它有一种......偏见?

就像,反复似乎得到相同的价值观。

我可能会想象它。

但很明显,我知道电脑不做随机井(所有),我想知道这个模块怎么连种子或任何...

是否有更好的方法来生成我的随机数?就像一个“更随机”的模块或一种给它“更随机”种子的方式?

+5

重复获得相同的值是随机性所固有的。如果你从来没有得到相同的价值观,那么这就是偏见。如果你掷出一个六面死一千次,并且从未连续得到两个六面体,那么就是操纵了它。 – Kevin

+0

Chekc这个信息,是随机使用,也许对你有帮助:https://docs.python.org/3/library/random.html# –

+0

你应该看看产生的数字,然后进行卡方检验他们。 –

更好使用SystemRandom以获得更好的不可预测性。 randrange是一个伪随机数发生器,它使用Mersenne Twister

from random import SystemRandom 

srand = SystemRandom() 

num1 = srand.choice(range(10)) 
num2 = srand.choice(range(10)) 
num3 = srand.choice(range(10)) 

print num1, num2, num3 
+0

谢谢!所有好的评论和我看到,我已经做的几乎肯定是好的,但由于你的答案提供了一个更不可预测的替代方案,我会去那! –

这很大程度上取决于您要查找的随机程度。 Python为os.urandom提供了密码使用的意图;但是从/ dev/urandom读取,而不是/ dev/random,因此对于某些极端情况(discussion on unix & linux stack exchange)可能不够随机。 secrets模块是为了更清晰的选择而开发的,而random模块显然是伪随机的。如果种子不重复(这样做对重复测试或重新生成相同的程序生成的游戏等是有帮助的,这就是为什么我们获得状态和设置状态),那么伪随机性通常就足够了。

一般来说,我们查找随机模式的能力远远超出了我们识别随机性的能力。

+0

感谢您的评论 - 特别是最后一个! –

我对随机或伪随机的差异了解不多,但如果您运行1000万次相同的randrange命令,则可以看到重复的百分比非常接近。所以我不认为你可以通过打印生成的数字并查看它们(至少不是这种情况)来发现任何非随机行为。

from random import randrange 
number_of_repeats = [0,0,0,0,0,0,0,0,0,0] 
percentage = {} 
loop_count = 10000000 
for _ in range(loop_count): 
    number_of_repeats[randrange(10)]+=1 
for num,i in enumerate(number_of_repeats): 
    percentage[num] = (i/loop_count)*100 
print(percentage) 
+0

很好地说明了! –