【问题标题】:How to "stash" random state generator state如何“存储”随机状态生成器状态
【发布时间】:2019-11-17 04:20:18
【问题描述】:

我正在播种一个随机数生成器以获得可重现的结果:

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]

到目前为止,我想出的是在我希望它变得不可复制之前不带参数播种,然后用 SEED 值重新播种:

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 的实例,您应该能够.getstate().setstate()
  • 或者你使用两个“随机”对象,其中一个用种子初始化。

标签: python random random-seed


【解决方案1】:

您无法使用random 函数来执行此操作,但您可以通过创建Random 类的实例来实现。 As the documentation states:

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

其实you can even using the functions from the random module,我的错:

random.getstate()返回一个捕获当前内部的对象 发电机的状态。这个对象可以传递给setstate() 恢复状态。

random.setstate(state) 状态应该是从以前的 调用getstate()setstate() 恢复内部状态 生成器恢复到调用 getstate() 时的状态。

【讨论】:

  • 第二部分正是我想要的。谢谢!
  • random(与random.Random 的实例或random.Random 的子类不同)是全局状态,出于与numpy.random.* was discouraged 相同的原因,我不鼓励它;它的使用应仅限于单元测试。
猜你喜欢
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 2011-08-25
  • 2013-10-30
  • 1970-01-01
  • 2019-08-01
相关资源
最近更新 更多