我想在区间 -1, 1
内生成随机数,且希望每个数字被生成的概率都相等。也就是说,我不希望极端值出现的概率更小。请问最佳方法是什么?
目前,我已经使用了以下方法:
2 * numpy.random.rand() - 1
还有:
2 * numpy.random.random_sample() - 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。由于浮点数是连续实数的离散化,在现实中存在一定的正概率获得某些极值。这是一种离散化误差,几乎可以肯定这种误差将被模拟中的其他错误所掩盖。停止担心吧!
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])
从numpy.random.random_sample
的文档中得知:
根据Per Sven Marnach的回答,文档可能需要更新以引用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 adda
:
(b - a) * random_sample() + a
numpy.random.uniform
。>>> 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浮点数,以避免舍入误差。