NumPy中获取随机数的最佳方法是什么?

25

我想在区间 -1, 1 内生成随机数,且希望每个数字被生成的概率都相等。也就是说,我不希望极端值出现的概率更小。请问最佳方法是什么?

目前,我已经使用了以下方法:

2 * numpy.random.rand() - 1

还有:

2 * numpy.random.random_sample() - 1

2
你使用的方法有没有遇到任何问题? - Sven Marnach
@ Sven,问题是我无法确定极端值被选择的可能性是否与其他所有可能性一样高。 - wot
4个回答

34

您的方法是正确的。另一个选择是使用函数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:在极端情况下添加了一条注释。 - Sven Marnach
谢谢Sven。我会尝试停止担心,但说起来容易做起来难。 - wot
请注意,在这两种方法中,区间是半开放的,因此上限将以概率0产生。 - ecatmur
1
@ecatmur:对于特定值“-1.0”和“1.0”作为边界,这是正确的。对于其他值,由于舍入,上限边界也可能会产生(我知道文档上说了另外一种情况,但文档是错误的)。无论如何,命中任何边界值的机会都是微不足道的,因此只有在实践中想要避免某些错误状态(例如除以零)时才有意义。 - Sven Marnach
1
正是我所需要的方法,比numpy文档清晰得多。 - ChuckCottrill

5
请注意,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的文档中得知:

Results are from the “continuous uniform” distribution over the stated interval. To sample Unif[A, b), b > a multiply the output of random_sample by (b-a) and add a:

 (b - a) * random_sample() + a
根据Per Sven Marnach的回答,文档可能需要更新以引用numpy.random.uniform

0
为确保范围[-1, 1]的极端值被包含,我随机生成一个numpy整数数组,范围在[0, 200000001)之间。后面这个整数的值取决于所需的最终numpy数据类型。在这里,我选择了numpy float64,这是numpy数组使用的默认类型。然后,我将numpy数组除以100000000以生成浮点数,并减去1。代码如下:
>>> 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浮点数,以避免舍入误差。


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