python - 如何“存储”随机状态生成器状态
问题描述
我正在播种一个随机数生成器以获得可重复的结果:
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
类的实例来执行此操作。正如文档所述:
如果你想使用你自己设计的不同的基本生成器,类
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
模块中的函数,我的错:
random.getstate()
返回一个捕获生成器当前内部状态的对象。可以传递这个对象setstate()
来恢复状态。
random.setstate(state)
state 应该是从之前的调用中获得的getstate()
,并将setstate()
生成器的内部状态恢复到调用时的状态getstate()
。
推荐阅读
- sql - 如何在 Oracle 中的每个破折号后划分字符并根据提取的值创建新列?
- pytorch - 微调 PyTorch:没有 deepcopy
- google-apps-script - 需要使用应用脚本从邮件中下载链接
- visual-studio-code - VS Code Python 扩展自动导入导入钩子而不是 src.hook
- django - 如何将外部数据库表呈现为 Django 模板?
- html - 如何对齐两个 div - 一个居中,另一个居中 - 两个 div 都可变宽度
- drupal - Drupal 的仪表板未正确显示
- navigation - Liferay.SPA.app.navigate 不会在没有路径的情况下重定向
- swiftui - 有没有办法在 SwiftUI 中“激活”自动换行?
- php - 我们如何在 Laravel 的单个控制器中处理 50 个依赖注入?