生成没有上限

时间:2015-06-09 01:39:42

标签: python numpy random random-seed

我希望以可预测的方式生成随机种子

我希望这样做

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之间

2 个答案:

答案 0 :(得分:5)

当我不想要上限时,我会经常使用sys.maxint作为近似值的上限

答案 1 :(得分:3)

你无法避免上限。没有一个代码怎么工作?这就是代码在xy之间生成随机数的方式:

0______________________________________________r__________________________________________1

r01之间的随机小数。这是使用固定算法生成的。

然后,它需要r并将其乘以上限减去下限。这几乎意味着0变为x1变为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%等。这是“没有上限”的对数分布。