跳转到内容

选择你自己的 Python 冒险/随机数和伪随机数生成器

来自维基教科书,开放世界中的开放书籍

计算机如何生成随机数?在自然现象的世界中,存在着(可能是)真正的随机性来源,例如放射性衰变,但大多数计算机并不使用它们。相反,计算机依赖于产生伪随机数的数学函数,称为伪随机数生成器 (PRNG)

给定最后一个生成的数字和一些配置参数(统称为状态),它们会确定性地生成另一个数字。在一个好的 PRNG 中,这些数字会看起来不可预测,除非你了解“秘密配方”(生成器的状态)。对于大多数用途,伪随机已经足够好

事实证明,Python 的random模块使用一个名为梅森旋转器的良好 PRNG。当你请求一个随机数时,旋转器会生成其序列中的下一个数字。如果你请求足够多[1]个数字,它们最终会重复。

敏锐的读者可能会发现这个计划中的一个缺陷。它如何确定要开始生成的第一个数字?事实证明,Python 使用时间、机器名称、昨天的棒球比分、好莱坞票房收入和其他不太可能重复的神秘事物[2]的组合来播种生成器。

让我们探索一下random模块。在此过程中,我们将学习rangefor 循环和种子。

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


  1. 2^(19937 − 1) 或 4.3 x 10e6001,这很多。
  2. 实际上,我不知道它是如何播种的,但它可能使用了时间、MAC 地址、IP 地址和其他独特的事物。
华夏公益教科书