代码之家  ›  专栏  ›  技术社区  ›  Bill

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

  •  3
  • Bill  · 技术社区  · 6 年前

    这是唯一一种“未看到”随机数生成器的方法:

    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 )

    1 回复  |  直到 6 年前
        1
  •  11
  •   user2357112    6 年前

    你走错了路。而不是试图取消查看 numpy.random separate RNG 对于需要重复的部分。这个RNG可以有一个完全独立于 默认RNG:

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

    虽然从技术上讲,保存和恢复全球经济的状态是可能的

    # Don't abuse this.
    state = numpy.random.get_state()
    do_stuff()
    numpy.random.set_state(state)
    
        2
  •  0
  •   johnnyasd12    4 年前

    另一种方法

    • 可以分别为每个循环生成随机种子,但如果在循环内生成种子,则在第一次迭代后将获得相同的种子值。
    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)
    
        3
  •  0
  •   Artem Bernatskyi second    3 年前

    Random 对象。

    myrandom = random.Random(myseed)
    

    random 模块管理自己的 Random ,将不受对所做更改的影响 myrandom .