选择你自己的 Python 冒险/随机数和伪随机数生成器
外观
计算机如何生成随机数?在自然现象的世界中,存在着(可能是)真正的随机性来源,例如放射性衰变,但大多数计算机并不使用它们。相反,计算机依赖于产生伪随机数的数学函数,称为伪随机数生成器 (PRNG)。
给定最后一个生成的数字和一些配置参数(统称为状态),它们会确定性地生成另一个数字。在一个好的 PRNG 中,这些数字会看起来不可预测,除非你了解“秘密配方”(生成器的状态)。对于大多数用途,伪随机已经足够好。
事实证明,Python 的random
模块使用一个名为梅森旋转器的良好 PRNG。当你请求一个随机数时,旋转器会生成其序列中的下一个数字。如果你请求足够多[1]个数字,它们最终会重复。
敏锐的读者可能会发现这个计划中的一个缺陷。它如何确定要开始生成的第一个数字?事实证明,Python 使用时间、机器名称、昨天的棒球比分、好莱坞票房收入和其他不太可能重复的神秘事物[2]的组合来播种生成器。
让我们探索一下random
模块。在此过程中,我们将学习range
、for 循环
和种子。
import random
help(random)
dir(random)
# range creates a list of ints.
help(range)
print range(0,10)
print range(10)
r = range(5,50,5)
print r
for ii in range(10):
print ii
# i,j, ii, jj, and the like are conventional variable
# names for counters, derived from mathematics
# we favor ii, since it's totally clear then that
# var has no inherent meaning
for ii in range(100):
# note that we don't use ii in the loop,
# we just want 100 of them!
print random.random()
# if we set the seed, we guarantee that we will
# get the same answer
random.seed(18485)
random.random() # should give 0.67979361840812036