如何在Python中生成多个随机数到足够的“随机”程度
我希望这个问题具有足够的问题值得关注,并且我没有错过这一点。我知道有可能有多个答案 - 我会标记出我得到的最好答案,但如果这不是一个好问题,那么请说,我会酌情删除。如何在Python中生成多个随机数到足够的“随机”程度
如果我使用的是需要大量(多于一个)随机数的Python脚本,例如
from random import randrange
number1 = randrange(10)
number2 = randrange(10)
number3 = randrange(10)
print number1, number2, number3
...那么是randrange最好的办法吗?具体来说,它究竟是多么随意?我觉得我发现它有一种......偏见?
就像,反复似乎得到相同的价值观。
我可能会想象它。
但很明显,我知道电脑不做随机井(所有),我想知道这个模块怎么连种子或任何...
是否有更好的方法来生成我的随机数?就像一个“更随机”的模块或一种给它“更随机”种子的方式?
更好使用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
谢谢!所有好的评论和我看到,我已经做的几乎肯定是好的,但由于你的答案提供了一个更不可预测的替代方案,我会去那! –
这很大程度上取决于您要查找的随机程度。 Python为os.urandom提供了密码使用的意图;但是从/ dev/urandom读取,而不是/ dev/random,因此对于某些极端情况(discussion on unix & linux stack exchange)可能不够随机。 secrets模块是为了更清晰的选择而开发的,而random模块显然是伪随机的。如果种子不重复(这样做对重复测试或重新生成相同的程序生成的游戏等是有帮助的,这就是为什么我们获得状态和设置状态),那么伪随机性通常就足够了。
一般来说,我们查找随机模式的能力远远超出了我们识别随机性的能力。
感谢您的评论 - 特别是最后一个! –
我对随机或伪随机的差异了解不多,但如果您运行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)
很好地说明了! –
重复获得相同的值是随机性所固有的。如果你从来没有得到相同的价值观,那么这就是偏见。如果你掷出一个六面死一千次,并且从未连续得到两个六面体,那么就是操纵了它。 – Kevin
Chekc这个信息,是随机使用,也许对你有帮助:https://docs.python.org/3/library/random.html# –
你应该看看产生的数字,然后进行卡方检验他们。 –