Python 生成无上限的随机整数

Python 生成无上限的随机整数,python,numpy,random,random-seed,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=Non

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

我希望这样做

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(我也在使用)有一个明确的种子值上限,这一点可以通过和这个错误得到证实

ValueError:种子必须介于0和4294967295之间


你无法避免上限。如果没有它,代码将如何工作?这就是代码在
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
随机导入
def randint():
i=0
尽管如此:
如果random.random()<0.5:#或您想要的任何其他概率
返回i
其他:
i+=1
基本上,这是从零开始的,然后每次它返回该数字的概率为0.5;否则它将继续


这意味着它的概率为0.5,1为25%,2为12.5%,3为5.25%,等等。这是“没有上限”的对数分布。

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

如果你不想要上限,您想要什么样的分销?它当然不可能是统一的。@GregHewgill我不明白为什么它不能是统一的。我知道种子是使用系统时间初始化的,所以它可能不超过64位。你有什么建议可以避免人为地设置一个较低的上限?@Agostino如果它是一个在无限范围内的均匀分布,则选择任何值的概率为0。让我想起了这个问题:如果需要64位无符号整数结果,可以设置0xFFFFFFFFFFFFFF的上限。然而,这与根本没有上限是完全不同的。@Agostino:当你开始处理无穷大时,事情会变得很奇怪。考虑这一点:假设您可以定义一个具有下界0的均匀分布。那么,分布的中值是多少?(中位数是分布的一半在下面,一半在上面的值。)您选择的任何有限值都是错误的,因为仍有无限多的分布大于您选择的值。你最终会得出这样一个自相矛盾的观点:中位数是“无穷大”,这毫无意义。我只需要避免人为地限制种子。为了清楚起见,在Java中,我只需调用并获取绝对值。你对我的需要有什么建议?对种子没有“人为的限制”。另外,rand并不是真正的随机数,所以如果你在寻找加密随机数,你应该使用不同的协议。您想要的是在可能的正整数或长整数的满刻度范围内的半随机数(在Python中,长整数具有无限精度,因此指定是无意义的)@Eric Renouf的回答似乎满足了这一要求。
sys.maxsize
能做到这一点并同时适用于Python 2和Python 3吗?@agostino是的,这是一个很好的计划。我根本不做Python3,所以以前没看过,对吧now@Agostino,是的,它对Python2和Python3都有效。