微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为测试播种随机生成器

如何解决为测试播种随机生成器

我使用 factory-boyget_random_state/set_random_state 使它工作,尽管这并不容易。最大的缺点是价值很大。所以想到的是将它写入文件。但是,如果我不小心运行测试而不告诉它从文件中播种,则该值将丢失。现在我考虑了一下,我也可以显示该值(想想 tee)。但我还是想把它减少到 4-5 位数。

我的想法如下。通常,当您运行测试时,它会在某处显示“种子:4215”。然后要重现相同的结果,我必须执行 SEED=4215 ./manage.py test 或其他操作。

我对 factory-boy 进行了一些实验,但后来我意识到即使使用 random 模块本身我也无法做到这一点。我尝试了不同的想法。到目前为止,他们都失败了。最简单的就是这样:

import random
import os
if os.getenv('A'):
    random.seed(os.getenv('A'))
else:
    seed = random.randint(0,1000)
    random.seed(seed)
    print('seed: {}'.format(seed))
print(random.random())
print(random.random())
/app $ A= python a.py
seed: 62
0.9279915658776743
0.17302689004804395

/app $ A=62 python a.py
0.461603098412836
0.7402019819205794

为什么结果不同?以及如何使它们相等?

解决方法

目前您的类型不同:

if os.getenv('A'):
    random.seed(os.getenv('A'))
else:
    seed = random.randint(0,1000)
    random.seed(seed)
    print('seed: {}'.format(seed))

在第一种情况下,您有一个 str,在第二种情况下有一个 int。您可以通过在第一种情况下强制转换 int 来解决此问题:

random.seed(int(os.getenv("A")))

我也不完全符合您直接播种 random 的需要;我认为对于 Factory Boy,您可以使用 factory.random.reseed_random (source)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?