5.3.3 保存状态
random()使用的伪随机算法的内部状态可以保存,并用于控制后续生成的随机数。如果在继续生成随机数之前恢复前一个状态,则会减少出现重复的可能性,则避免出现之前输入中重复的值或值序列。getstate()函数返回一些数据,以后可以借助setstate()利用这些数据重新初始化伪随机数生成器。
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-know start state.
print('No state.dat,seeding')
random.seed(1)
# Produce random values.
for i in range(3):
print('{:04.3f}'.format(random.random()),end=' ')
print()
# Save state for next time.
with open('state.dat','wb') as f:
pickle.dump(random.getstate(),f)
# Produce more random values.
print('\nAfter saving state:')
for i in range(3):
print('{:04.3f}'.format(random.random()),end=' ')
print()
getstate()返回的数据是一个实现细节,所以这个例子用pickle将数据保存到一个文件;否则,它会把伪随机生成器当作一个黑盒。如果程序开始时这个文件存在,则加载原来的状态并继续。每次运行时都会在保存状态之前和之后生成一些数,以展示恢复状态会使生成器再次生成同样的值。
运行结果:
注: 请运行两次结果。