我使用factory-boy的get_random_state/set_random_state实现了它,虽然这并不容易。最大的缺点是它的值很大。所以我想到的就是把它写到一个文件中。但是如果我不小心运行了测试,没有告诉它从文件中产生种子,这个值就会丢失。现在我想起来,我也可以显示这个值(想想tee)。但我仍然想把它减少到4-5位。
我的想法如下。通常,当您运行测试时,它会在某处显示"seed: 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为什么结果会有所不同?如何让它们变得平等?
发布于 2021-01-03 13:19:08
当前您的类型不同:
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)。
https://stackoverflow.com/questions/65546784
复制相似问题