本文翻译自 Doug Hellmann 的 PyMOTW-3项目的random模块。
原文链接:https://pymotw.com/3/random/index.html
本文使用cc-by-nc-sa 4.0协议共享。
random—伪随机数生成器
random模块提供了基于Mersenne Twister算法的快速伪随机数生成器。起初开发它是为了产生蒙特卡洛模拟的输入,Mersenne Twister生成的数近乎均匀分布并且周期大,使其适合更加广泛的应用。
生成随机数
random函数从生成序列中返回下一个随机浮点数。所有返回值都包含在0 <= n < 1.0。
# random_random.py
import random
for i in range(5):
print('%04.3f' % random.random(), end=' ')
print()
重复运行程序以获得不同的值序列。
$ python3 random_random.py
0.859 0.297 0.554 0.985 0.452
$ python3 random_random.py
0.797 0.658 0.170 0.297 0.593
为获得特定范围的数,使用uniform()。
# random_uniform.py
import random
for i in range(5):
print('{:04.3f}'.format(random.uniform(1, 100)), end=' ')
print()
传递最大值和最小值, 然后uniform()使用公式min + (max - min) * random()调整random()的返回值。
$ python3 random_uniform.py
12.428 93.766 95.359 39.649 88.983
种子
random()在每次调用时产生不同的值,在重复任何值前有相当大的周期。这对产生唯一的值或变量很有用,有时也对以不同的方式处理相同的数据集很有用。一种技术是使用程序生成随机值,并保存随机值到独立的步骤中处理。但是,这对大型数据集来说不切实际,因此random提供了初始化伪随机数生成器的seed()函数,以生成一组预期的值。
# random_seed.py
import random
random.seed(1)
for i in range(5):
print('{:04.3f}'.format(random.random()), end=' ')
print()
种子控制了伪随机数生成公式的第一个值,并当公式确定时也设置了种子改变后生成的完整序列。seed()的参数可以是任何hashable 对象。默认使用平台特定的随机资源,如果有的话。否则,使用当前时间。
保存状态
random()中使用的伪随机数算法的内部状态可以被保存下来,用以控制后续运行中生成的数字。在继续运行前保存先前的状态可减少从以前的输入重复值或值序列的可能性。getstate()返回的数据可用于稍后通过setstate()重新初始化随机数生成器。
# random_state.py
import random
import os
import pickle
if os.path.exists('state.dat'):
#Restore the previously saved state
print('Found state.dat, initializing random module')
with open('state.dat','rb') as f:
state =pickle.load(f)
random.setstate(state)
else:
# Use a well-known start state
print('No state.dat, seeding')
random.seed(1)
#Produce random values
for i in range(3):
print('{:04.3f}'.format(random.ra