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

时间:2018-09-27 20:51:11

标签: python numpy random seed

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

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

如果您希望某个循环中的某些代码与每个循环中希望随机的其他代码可重复使用(例如,测试),那么在设置种子后如何将其“重置”为随机数生成器?

以下代码说明了该问题:

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]

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

如果这是导入时间模块的唯一方法,我很高兴,但是我认为可能会有一种更简单,更强大的方法。

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

3 个答案:

答案 0 :(得分:9)

您走错了路。与其尝试取消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的状态,但这是一个非常专业的操作,很少是一个好主意。例如,如果您要调试一段代码,并且想在向后跳转代码后“倒带”随机状态,则可能会很有用,尽管您需要事先保存状态,并且它不会倒带任何其他随机数生成器:

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

答案 1 :(得分:0)

另一种方法

  • 您可以分别为每个循环生成随机种子,但是如果在循环内生成它们,则在第一次迭代后将获得相同的种子值。
  • 要避免每个循环中的种子相同,只需事先在循环外部生成不同的种子即可。
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)

答案 2 :(得分:0)

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

myrandom = random.Random(myseed)

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