不设上限生成随机整数

5

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

我希望能够实现这个目标。

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


5
如果您不想要一个上限,您希望什么样的分布?它肯定不可能是均匀分布。 - Greg Hewgill
@GregHewgill 我不明白为什么它不能是均匀的。我知道种子是使用系统时间初始化的,因此它可能不超过64位。您建议采取什么措施以避免设置人为低的上限? - Agostino
2
@Agostino 如果它是在无限范围内的均匀分布,那么选择任何值的概率都是0。这让我想起了这个问题:http://stackoverflow.com/q/30118305/1726343 - Asad Saeeduddin
1
@Agostino:当你开始处理无限大时,事情可能会变得奇怪。考虑这个问题:假设你可以定义一个下界为0的均匀分布。那么,这个分布的中位数值是多少?(中位数是使得分布一半在其下方,一半在其上方的值)。你选择任何有限的值都是错误的,因为仍然会有无限数量的分布大于你选择的值。你最终得到了一个自相矛盾的想法,即中位数是“无穷大”,这是没有意义的。 - Greg Hewgill
@Agostino:在有界均匀分布 [a,b] 中,中位数将是 (a + b) / 2。 - Greg Hewgill
显示剩余3条评论
3个回答

9

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


1
sys.maxsizeиғҪеҗҰи§ЈеҶій—®йўҳ并еҗҢж—¶йҖӮз”ЁдәҺPython 2е’Ң3е‘ўпјҹ - Agostino
@agostino,是的,这是一个很好的计划。我根本不使用Python 3,所以现在还没有看过它。 - Eric Renouf
@Agostino,是的,它适用于Python2和Python3。 - Alex Huszagh

3

您无法避免上限。没有上限,代码怎么能工作呢?这是代码如何在xy之间生成随机数的方式:

0______________________________________________r__________________________________________1

r是介于01之间的随机小数。这是通过固定算法生成的。

然后,它将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开始,每次有50%的概率返回该数字;否则它会继续运行。
这意味着它有50%的概率是0,25%的概率是1,12.5%的概率是2,5.25%的概率是3等等。这是一个“无上限”的对数分布。

我只需要避免对种子施加人为限制。简单来说,在Java中,我只需调用nextInt并取绝对值。你有什么建议吗? - Agostino
2
种子中不存在“无人为限制”的概念。此外,rand并不是真正的随机数,因此如果您正在寻找加密随机数,应该使用不同的协议。您想要的是在可能的正整数或长整数的完整范围内的半随机数(在Python中具有无限精度,因此该指定无意义)。@Eric Renouf的答案似乎满足了这个要求。 - Alex Huszagh

0

从数学上讲,在无界整数集上不存在均匀分布(这在评论中已经得到正确指出)。对Eric Renouf的回答给予+1的评价。

为了后人,问题在于每个可能结果的概率必须共同总和为1(这是概率分布的定义的一部分)。如果选择任何一个整数的机会是正值p>0,则当你无限地加起来(\sum_np)时,你得到的总数是无穷大,而不是1。这是任何正的p>0的结果。但是,如果p=0,则你得到的总数是0,而不是1。你可以说,“理论上”不存在没有上限的随机整数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接