临时修复后恢复随机种子的最佳方法是什么?

Bil*_*ill 4 python random numpy seed

这是"取消种子"随机数生成器的唯一方法:

np.random.seed(int(time.time()))
Run Code Online (Sandbox Code Playgroud)

如果你想要在循环中使用某些代码来重复(例如测试),而其他代码要在每个循环中随机进行,那么在设置后如何将种子"重置"为随机数生成器?

以下代码说明了此问题:

import numpy as np

def test():
    np.random.seed(2)
    print("Repeatable test:", [np.random.randint(10) for i in range(3)])

for i in range(4):
    print("Random number:", np.random.randint(10))
    test()

Random number: 8
Repeatable test: [8, 8, 6]
Random number: 2
Repeatable test: [8, 8, 6]
Random number: 2
Repeatable test: [8, 8, 6]
Random number: 2
Repeatable test: [8, 8, 6]
Run Code Online (Sandbox Code Playgroud)

期望的结果:我希望每个循环随机数是随机的.

我很乐意导入时间模块,如果这是唯一的方法,但我认为可能有一个更简单,更健壮的方式.

(根据这篇文章你不能得到当前的种子)

use*_*ica 10

你走错了路.不要尝试取消使用的全局RNG numpy.random,而是对需要重复的部分使用单独的RNG.该RNG可以与numpy.random默认RNG 具有完全独立的状态:

def test():
    rng = numpy.random.RandomState(2)
    print("Repeatable test:", [rng.randint(10) for i in range(3)])
Run Code Online (Sandbox Code Playgroud)

虽然在技术上可以保存和恢复全球numpy.randomRNG 的状态,但它是一种非常专业的操作,并且很少是一个好主意.例如,如果您正在调试一段代码并且想要在向后跳过代码后"倒回"随机状态,这可能是有用的,尽管您需要提前保存状态,并且它不会倒带任何其他随机数发生器:

# Don't abuse this.
state = numpy.random.get_state()
do_stuff()
numpy.random.set_state(state)
Run Code Online (Sandbox Code Playgroud)


Art*_*kyi 6

您可以实例化您自己的Random对象。

myrandom = random.Random(myseed)
Run Code Online (Sandbox Code Playgroud)

random模块管理它自己的 实例Random,该实例不会受到对 的更改的影响myrandom