Python 如何";藏匿;随机状态发生器状态

Python 如何";藏匿;随机状态发生器状态,python,random,random-seed,Python,Random,Random Seed,我正在植入一个随机数生成器,以获得可重复的结果,包括: import random SEED = 32412542 random.seed(SEED) 我想让它只为程序的一部分返回“不可复制”的随机值,如: import random SEED = 32412542 random.seed(SEED) my_list = [1, 2, 3, 4, 5] res = random.sample(my_list, len(my_list)) # I would like result o

我正在植入一个随机数生成器,以获得可重复的结果,包括:

import random

SEED = 32412542
random.seed(SEED)
我想让它只为程序的一部分返回“不可复制”的随机值,如:

import random

SEED = 32412542
random.seed(SEED)

my_list = [1, 2, 3, 4, 5]

res = random.sample(my_list, len(my_list))  # I would like result of this to be the same between runs of the program.

# Do some reproducible calculations, such as training neural network.
print(res)  # E.g. prints [3, 2, 4, 1, 5]

# What to do here?
res = random.sample(my_list, len(my_list))  # I would like result of this to be different between runs.

# Do some non-reproducible calculations, such as picking neural network parameters randomly.
print(res)  # Prints some random order.

res = random.sample(my_list, len(my_list))  # I would like result of this to be the same between runs of the program.

# Do some reproducible calculations, such as training neural network.
print(res)  # E.g. prints [2, 3, 1, 4, 5]
到目前为止,我想到的是,在我希望它变得不可复制之前,不使用任何参数进行种子设定,然后使用
种子
值重新进行种子设定:

import random

SEED = 32412542
random.seed(SEED)

my_list = [1, 2, 3, 4, 5]

res = random.sample(my_list, len(my_list))
print(res)  # Prints: [3, 2, 4, 1, 5]

random.seed()
res = random.sample(my_list, len(my_list))
print(res)  # Prints some random order.

random.seed(SEED)
res = random.sample(my_list, len(my_list))
print(res)  # Prints: [3, 2, 4, 1, 5], so exactly what has been printed before.

问题是,在重新设定种子后,会产生完全相同的随机值集(显然-最终这就是设定特定值的目的),我不希望发生这种情况。我想以某种方式恢复随机生成器以前的状态。这可能吗?

您不能使用
random
函数,但可以通过创建
random
类的实例来实现

如果要使用不同的 您自己设计的基本生成器:在这种情况下,覆盖
random()
seed()
getstate()
,以及
setstate()
方法。或者,一个 新生成器可以提供getrandbits()方法-这允许 randrange()生成任意大范围的选择

例如:

>>> import random
>>> r = random.Random()
>>> r.randint(1, 1000)
545
>>> r.randint(1, 1000)
349
>>> r.randint(1, 1000)
745
>>> r.randint(1, 1000)
792
>>> state = r.getstate()
>>> r.randint(1, 1000)
52
>>> r.randint(1, 1000)
799
>>> r.randint(1, 1000)
586
>>> r.randint(1, 1000)
581
>>> r.setstate(state)
>>> r.randint(1,1000)
52
>>> r.randint(1,1000)
799
>>> r.randint(1,1000)
586
>>> r.randint(1,1000)
581

事实上,我的缺点是:

random.getstate()
返回捕获当前内部数据的对象 发电机的状态。此对象可以传递到
setstate()
to 恢复状态

random.setstate(状态)
状态应该是从以前的 调用
getstate()
,然后
setstate()
恢复 将生成器设置为调用
getstate()
时的生成器


如果您创建
random.random
的实例,您应该能够
.getstate()
.setstate()
或者使用两个“随机”对象,其中一个对象用种子初始化。第二部分正是我要找的。谢谢
random
(与
random.random
的实例或
random.random
的子类不同)是全局状态,我不鼓励它,原因与以下相同:;它的使用应限于单元测试。