numpy 生成没有上限的随机整数

7fhtutme  于 2023-03-23  发布在  其他
关注(0)|答案(3)|浏览(126)

我想以一种可预测的方式生成一个随机的种子。
我希望能做这个

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:种子必须介于0和4294967295之间

qacovj5a

qacovj5a1#

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

uttx8gqw

uttx8gqw2#

无法避免上限。如果没有上限,代码将如何工作?下面是代码如何生成xy之间的随机数:

0______________________________________________r__________________________________________1

r01之间的随机小数。这是用固定算法生成的。
然后,它将r乘以上界减去下界。这几乎意味着0变成x1变成y。如果rand是随机数,则r : (1 - 0) :: rand : (y - x)

EDIT:实际上 * 有 * 一种方法可以生成一个没有上限的随机数,但它不是对数的,也不是均匀分布的。看看这个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%,等等。

2nbm6dog

2nbm6dog3#

我没有足够的声誉来评论,但如果我可以补充一下:从字面上看,数学上不存在一个统一的分布在一个无界的整数集(这是正确地指出,在commands)。+1到该评论埃里克Renouf的答案。
对于后代来说,问题是每个可能结果的概率总和必须为1(这是概率分布定义的一部分)。如果选择任何一个整数的概率是正值p〉0,那么当你对无穷多个这样的概率求和时(\sum_np),你会得到无穷大的总和,而不是1。这是任何正p〉0的结果。但是如果p=0,那么你反而会得到0的总和,不是1。你可以说“理论上”不存在没有上限的随机整数。

相关问题