临时修复后恢复为随机种子的最佳方法?
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)
对我有用
这是 '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)
对我有用