【问题标题】:Numpy random integer generator not covering full interval?Numpy随机整数生成器不覆盖整个间隔?
【发布时间】:2020-04-30 10:22:05
【问题描述】:

当在(几乎)int64 允许的完整间隔上生成随机整数时,生成的整数似乎是在更小的范围内生成的。我正在使用以下代码:

import numpy
def randGenerationTest(n_gens=100000):
    min_int = 2**63
    max_int = 0
    for _ in range(n_gens) :
        randMatrix = numpy.random.randint(low=1, high = 2**63, size=(1000,1000))
        a = randMatrix.min()
        b = randMatrix.max()
        if a < min_int:
            min_int = a
        if b > max_int :
            max_int = b
    return min_int, max_int

返回以下内容:

randomGenerationTest()
>>> (146746577, 9223372036832037133)

我同意 [1, 146746577] 仅代表我试图获得的整个范围的一小部分,但是在 [1,2^63) 范围内生成的 1e11 随机整数中,我应该只是曾经接近我的边界? 使用太大的间隔时,这是预期的行为吗? 或者是因为作为一个人,我无法理解这些间隔有多大,而且我已经“足够接近”了?

顺便说一下,这只是想知道种子是否可以从 1 到 1e63 随机设置,因为可以手动将其设置为任何这些值。

【问题讨论】:

    标签: python numpy random


    【解决方案1】:

    您正在生成 10^3 * 10^3 * 10^5 = 10^11 个值。 2^63 / 10^11 ~= 10e+08。您甚至还没有接近填充值的空间。作为粗略的手工计算,如果您要对均匀空间的 1/10^n 个元素进行采样,则样本的最小值和最大值与最大和最小元素相差约 n 个数量级似乎非常合理。

    【讨论】:

      【解决方案2】:

      你的最大值的差异。编号9223372036832037133 到区间2**63 - 1 的上边界是22738674。这只是整个范围的2.46e-12。这同样适用于分钟。值146746577,相对于区间的整个范围,它与下边界的距离约为1.59e-11。这意味着您覆盖了超过 99.999999999% 的区间范围,即几乎所有内容。

      【讨论】:

      • 谢谢!所以它确实已经足够接近边界了,只是与我们使用的通常比例相比,146746577 似乎仍然非常接近。
      猜你喜欢
      • 1970-01-01
      • 2018-10-09
      • 2014-08-22
      • 2013-10-14
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多