如何在Python中生成多个随机数到足够随机的#39;学位

时间:2017-08-17 12:50:02

标签: python random

我希望这个问题具有足够的问题,并且我没有错过这一点。我知道有可能有多个答案 - 我会标记出我认为最合适的答案,但如果这不是一个可以提问的问题那么请说出来,我将酌情删除。

如果我使用python脚本,那里需要大量(多个)随机数,例如

from random import randrange

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

print number1, number2, number3

...那么randrange是最好的方法吗?具体来说,它实际上是多么随机?我觉得我注意到它有某种......偏见?

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

我可能在想象它。

但显然我知道计算机不能随意做好(根本没有),我想知道这个模块是如何播种的,或者其他什么......

有没有更好的方法来生成我的随机数?就像一个模块更加随机"或者给它一个更随机的方式"种子?

3 个答案:

答案 0 :(得分:1)

最好使用doc_cleanappend(finalized_words) 以获得更好的不可预测性。 SystemRandom是伪随机数生成器,使用Mersenne Twister

randrange

答案 1 :(得分:1)

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

一般来说,我们发现随机性模式的能力远远超过我们识别随机性的能力。

答案 2 :(得分:1)

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

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)