【问题标题】:What is the best way of getting random numbers in NumPy?在 NumPy 中获取随机数的最佳方法是什么?
【发布时间】:2012-07-25 06:22:20
【问题描述】:

我想生成-1, 1 范围内的随机数,并希望每个随机数具有相同的生成概率。 IE。我不希望极端情况不太可能出现。这样做的最佳方法是什么?

到目前为止,我已经使用过:

2 * numpy.random.rand() - 1

还有:

2 * numpy.random.random_sample() - 1

【问题讨论】:

  • 您使用的方法有什么问题吗?
  • @Sven 问题是我不能确定极端情况与所有其他可能性一样有可能被选择。

标签: python numpy random


【解决方案1】:

你的方法很好。另一种方法是使用函数numpy.random.uniform()

>>> numpy.random.uniform(-1, 1, size=10)
array([-0.92592953, -0.6045348 , -0.52860837,  0.00321798,  0.16050848,
       -0.50421058,  0.06754615,  0.46329675, -0.40952318,  0.49804386])

关于极值的概率:如果将其理想化为连续随机数,则获得一个极值的概率将为 0。由于浮点数是连续实数的离散化,因此实际上存在一些获得某些极端的正概率。这是某种形式的离散化误差,几乎可以肯定,这个误差会被您的模拟中的其他误差所抵消。别担心!

【讨论】:

  • @wok:添加了关于极端情况的评论。
  • 谢谢斯文。我会尝试停止担心 :-) 但说起来容易做起来难。
  • 请注意,在这两种方法中,区间都是半开的,因此上限的产生概率为 0。
  • @ecatmur:对于具体值-1.01.0作为边界,这是真的。对于其他值,上边界也可能由于舍入而产生(我知道文档说的是其他内容,但文档是错误的)。无论如何,达到任何个边界值的机会都可以忽略不计,因此只有在您想避免某些错误状态(例如除以零)时,这在实践中才有意义。
  • 正是我需要的方法,而且比 numpy 文档清晰得多。
【解决方案2】:

请注意,numpy.random.rand 允许一次调用从均匀分布生成多个样本:

>>> np.random.rand(5)
array([ 0.69093485,  0.24590705,  0.02013208,  0.06921124,  0.73329277])

它还允许生成给定形状的样本:

>>> np.random.rand(3,2)
array([[ 0.14022471,  0.96360618], 
       [ 0.37601032,  0.25528411], 
       [ 0.49313049,  0.94909878]])

正如你所说,[-1, 1) 之间的均匀分布随机数可以通过以下方式生成:

>>> 2 * np.random.rand(5) - 1
array([ 0.86704088, -0.65406928, -0.02814943,  0.74080741, -0.14416581])

【讨论】:

    【解决方案3】:

    来自numpy.random.random_sample 的文档:

    结果来自规定区间内的“连续均匀”分布。要采样 Unif[A, b), b > a 将 random_sample 的输出乘以 (b-a) 并加上 a

     (b - a) * random_sample() + a
    

    根据 Sven Marnach 的回答,文档可能需要更新以引用 numpy.random.uniform

    【讨论】:

      【解决方案4】:

      为了确保包含范围 [-1, 1] 的极值,我随机生成一个范围为 [0, 200000001[ 的整数的 numpy 数组。后一个整数的值取决于所需的最终 numpy 数据类型。在这里,我采用 numpy float64,这是用于 numpy 数组的默认类型。然后,我将 numpy 数组除以 100000000 以生成浮点数并减去单位。代码如下:

      >>> import numpy as np
      >>> number = ((np.random.randint(low=0, high=200000001, size=5)) / 100000000) - 1
      >>> print(number)
      [-0.65960772  0.30378946 -0.05171788 -0.40737182  0.12998227]
      

      确保不要将这些 numpy 浮点数转换为 python 浮点数以避免舍入错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 2023-03-24
        • 2019-02-22
        • 1970-01-01
        相关资源
        最近更新 更多