生成没有上限的随机整数

Generate random integer without an upper bound

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

我希望这样做

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 must be between 0 and 4294967295

你无法避免上限。如果没有代码,代码将如何工作?这就是代码在 xy 之间生成随机数的方式:

0______________________________________________r__________________________________________1

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

然后,它需要 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.5 的概率为 0,25% 为 1,12.5% 为 2,5.25% 为 3,等等。这是对数分布 "without an upper bound"。

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