python的random包经常被用于模拟实验的重现,数据集的随机划分的确定性重现。然而,我本人之前对random.seed()什么时候调用,调用之后会对之后多少代码起决定性作用这一块感到云里雾里。今日得以有闲,作文以澄清之。
random.seed()是用来初始化随机数生成器的。确定生成器的初始状态。在调用random库中一些随机函数的过程中(例如random.shuffle()等),随机状态会发生改变。
这个时候,如果还想再次从相同的状态开始生成相同的随机结果,就需要重新设置相同的随机种子才可以。
例如
import random
if __name__ == '__main__':
# 初始化随机数生成器
random.seed(0)
# 获取初始状态
ini_state = random.getstate()
a = list(range(11))
# 生成一些随机数
random.shuffle(a)
print(a)
# 再生成一些随机数
b = list(range(11))
random.shuffle(b)
print(b)
运行结果是:
这表明两次生成的随机数是不同的。
要想生成相同的随机数,怎么办呢?
有两种办法
1 再次初始化随机数生成器
2 在初始化随机数生成器之后,调用random.getstate()方法以获取该对象的状态,保存该状态,并在再次生成随机数之前调用random.setstate()方法来恢复初始状态。这样就可以保证两次生成的随机数是相同的。
案例展示:
import random
if __name__ == '__main__':
# 初始化随机数生成器
random.seed(0)
# 获取初始状态
ini_state = random.getstate()
a = list(range(11))
# 生成一些随机数
random.shuffle(a)
print(a)
# 再生成一些随机数
b = list(range(11))
random.setstate(ini_state) # 恢复生成器状态
random.shuffle(b)
print(b)
妙哉。
其余的类似的随机种子可以同样考虑