繁体   English   中英

为测试播种随机生成器

[英]Seeding the random generator for tests

我使用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_randomsource )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM