【问题标题】:Random int64 and float64 numbers随机 int64 和 float64 数字
【发布时间】:2010-12-12 03:25:29
【问题描述】:

我正在尝试使用 Numpy 为整数和浮点数生成随机的 64 位整数值,在该类型的整个有效值范围内。要生成随机 32 位浮点数,我可以使用:

In [2]: np.random.uniform(low=np.finfo(np.float32).min,high=np.finfo(np.float32).max,size=10)
Out[2]: 
array([  1.47351436e+37,   9.93620693e+37,   2.22893053e+38,
        -3.33828977e+38,   1.08247781e+37,  -8.37481260e+37,
         2.64176554e+38,  -2.72207226e+37,   2.54790459e+38,
        -2.47883866e+38])

但如果我尝试将其用于 64 位数字,我会得到

In [3]: np.random.uniform(low=np.finfo(np.float64).min,high=np.finfo(np.float64).max,size=10)
Out[3]: array([ Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf,  Inf])

同样,对于整数,我可以成功生成随机的 32 位整数:

In [4]: np.random.random_integers(np.iinfo(np.int32).min,high=np.iinfo(np.int32).max,size=10)
Out[4]: 
array([-1506183689,   662982379, -1616890435, -1519456789,  1489753527,
        -604311122,  2034533014,   449680073,  -444302414, -1924170329])

但是对于 64 位整数我不成功:

In [5]: np.random.random_integers(np.iinfo(np.int64).min,high=np.iinfo(np.int64).max,size=10)
---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)

/Users/tom/tmp/<ipython console> in <module>()

/Library/Python/2.6/site-packages/numpy/random/mtrand.so in mtrand.RandomState.random_integers (numpy/random/mtrand/mtrand.c:6640)()

/Library/Python/2.6/site-packages/numpy/random/mtrand.so in mtrand.RandomState.randint (numpy/random/mtrand/mtrand.c:5813)()

OverflowError: long int too large to convert to int

这是预期的行为,还是我应该将这些作为 Numpy 中的错误报告?

【问题讨论】:

  • 你最后解决了吗?

标签: python random numpy


【解决方案1】:

对于整数,您可以生成 2 个 32 位随机数并将它们组合起来:

a + (b << 32)

【讨论】:

  • 生成器可以有偏差。使用循环生成器,a => b .
  • @B.M.为什么你认为它可能有偏见?有没有办法克服偏见?
【解决方案2】:

numpy.random.uniform() 的代码似乎在某个时刻进行了高低计算,而 Inf 源于那里。

如图所示,均匀分布的整数很容易生成。均匀分布的浮点数需要更仔细的思考。

至于将这些怪事报告为错误,我认为您应该这样做或在项目邮件列表中发布消息。这样你至少会发现开发人员认为什么是合理的行为。

【讨论】:

    【解决方案3】:

    问题似乎在于 random_numbers 方法只需要 32 位整数。

    根据ticket #555,从 1.1.0 版开始,随机种子现在可以是 64 位的,我建议从here 下载并安装最新版本的 NumPy。

    【讨论】:

    • 它说的是哪个版本?
    • np.__version__ 给出 1.4.0.dev7539
    • 也许您应该尝试使用更稳定的版本?这张票只是简单地谈到了 64 位随机数播种,也许它指的是不同的随机数生成器。
    【解决方案4】:

    我不相信它指的是随机种子调用。我得到的最简单的代码属于“Python int too large to convert to C long”是:

    x = numpy.random.random_integers(2**64,size=(SIZE,)).astype(numpy.uint64)
    

    numpy.版本=1.5.0 这里

    【讨论】:

    • np.random.random_integers 已弃用,请使用 np.random.randint(2**64, dtype=np.uint64)
    【解决方案5】:

    我意识到这是一个非常古老的问题,但是 Python 3.6.3 中有一个新答案:

    Python 3.6.3 |Anaconda, Inc.| (default, Oct  6 2017, 12:04:38) 
    [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import numpy as np
    >>> import sys
    >>> sys.maxsize
    9223372036854775807
    >>> np.random.randint(sys.maxsize)
    8550528944245072046
    

    【讨论】:

      猜你喜欢
      • 2019-09-22
      • 2020-06-26
      • 2020-04-30
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多