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

Best way to revert to a random seed after temporarily fixing it?

这是 'unseed' 随机数生成器的唯一方法吗:

np.random.seed(int(time.time()))

如果您有一些代码希望在一个循环中重复(例如测试),而其他代码您希望每个循环都是随机的,那么您如何 'reset' 随机数生成器的种子设置后?

下面的代码说明了这个问题:

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]

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

如果这是唯一的方法,我很乐意导入时间模块,但我认为可能有更简单、更可靠的方法。

(无法根据获取当前种子)

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

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

虽然在技术上可以保存和恢复全局 numpy.random RNG 的状态,但这是一个非常专业的操作,很少是一个好主意。这可能是有用的,例如,如果你正在调试一段代码,并且你想 "rewind" 向后跳转代码后的随机状态,虽然你需要提前保存状态,但它不会' t 倒回任何其他随机数生成器:

# Don't abuse this.
state = numpy.random.get_state()
do_stuff()
numpy.random.set_state(state)

另一种方法

  • 您可以分别为每个循环生成随机种子,但如果您在循环内生成它们,您将在第一次迭代后获得相同的种子值。
  • 为了避免每次循环的种子都一样,在循环外预先生成不同的种子即可。
import numpy as np

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

n_loop = 4
max_rand_int = 1000*n_loop # i think this is enough
seeds = np.random.randint(max_rand_int, size=n_loop) # make list of seeds
for i in range(n_loop):
    print("Random number:", np.random.randint(10))
    test()
    seed = seeds[i]
    np.random.seed(seed)

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

myrandom = random.Random(myseed)

random 模块管理它自己的 Random 实例,它将不受对 myrandom.

所做更改的影响

随机。种子 ( a=None, version=2 ) 初始化随机数生成器。 如果省略 a 或 None,则使用当前系统时间。如果操作系统提供随机源,则使用它们代替系统时间(有关可用性的详细信息,请参阅 os.urandom() 函数)

random.seed(None)

对我有用

Python 3.8 docs