Python Random模块sample方法setstate失效问题求助
问题分析与解决
你的操作错误在于保存随机状态的时机不对,导致恢复状态后无法重现seed(7)后的随机序列。
错误原因拆解
你先执行random.getstate()保存了随机数生成器的初始默认状态,之后才调用random.seed(7)修改了生成器状态。后续调用random.setstate(state)恢复的是seed设置前的初始状态,而非seed(7)生效后的状态,因此生成的随机序列和seed(7)后的结果毫无关联。
正确操作方式
如果想重现seed(7)后的随机采样结果,需要在设置seed之后立刻保存状态:
>>> random.seed(7) >>> state_after_seed = random.getstate() # 保存seed生效后的状态 >>> x = list(range(10)) >>> random.sample(x, 5) [5, 2, 6, 9, 0] >>> random.sample(x, 5) [1, 8, 9, 2, 4] >>> random.setstate(state_after_seed) # 恢复到seed后的初始状态 >>> random.sample(x, 5) [5, 2, 6, 9, 0] # 和第一次采样结果完全一致
补充说明
每次调用random.sample()都会消耗随机数生成器的内部状态,所以连续调用会得到不同结果是正常行为。只要在需要固定序列的节点保存状态,后续恢复该状态就能精准重现后续的随机输出。
内容的提问来源于stack exchange,提问作者acai
相关产品推荐
相关产品推荐

