我希望以可预测的方式生成随机种子。
我希望这样做
seed = 12345
prng_0 = random.Random(seed)
prng_1 = random.Random(prng_0.rand_int(0))
在那里,0
是下限,但事实证明我也需要给它一个上界。我不想设置固定的上限。
如果您对我的理由感到好奇,我这样做是因为我在测试时需要重复性。也就是说,这是一个接收种子并构建其prng prng_0
的函数,然后多次调用另一个需要每次都接收不同种子的函数。
def funct_a(seed=None):
prng_1 = random.Random(seed)
prng_2 = numpy.random.RandomState(prng_1.randint(0, 4294967296))
print(prng_1.random())
print(prng_2.random())
def funct_b(seed=None):
prng_0 = random.Random(seed)
for i in range(0, 5):
seed = prng_0.randint(0) # not working, needs upper bound
funct_a(seed)
funct_b(12345) # test call
编辑:有趣的是,numpy(我也在使用)有一个明确的上部种子值,由doc和此错误证明
ValueError:Seed必须介于0和4294967295之间
答案 0 :(得分:5)
当我不想要上限时,我会经常使用sys.maxint
作为近似值的上限
答案 1 :(得分:3)
你无法避免上限。没有一个代码怎么工作?这就是代码在x
和y
之间生成随机数的方式:
0______________________________________________r__________________________________________1
r
是0
和1
之间的随机小数。这是使用固定算法生成的。
然后,它需要r
并将其乘以上限减去下限。这几乎意味着0
变为x
,1
变为y
。如果rand
是随机数,r : (1 - 0) :: rand : (y - x)
编辑:实际上 是一种生成没有上限的随机数的方法,但它不是对数的,也不是均匀分布的。看看这个python算法:
import random
def randint():
i = 0
while True:
if random.random() < 0.5: # Or whatever other probability you want
return i
else:
i += 1
差不多,这样做是从零开始,然后每次有0.5次返回该数字的概率;否则它会继续。
这意味着它为0的概率为0.5,1为25%,2为12.5%,3为5.25%等。这是“没有上限”的对数分布。