我想生成-1, 1
范围内的随机数,并希望每个人都有相同的生成概率。即我不希望极端情况不太可能出现。这样做的最佳方式是什么?
到目前为止,我已经使用过:
2 * numpy.random.rand() - 1
还有:
2 * numpy.random.random_sample() - 1
答案 0 :(得分:31)
你的方法很好。另一种方法是使用函数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.由于浮点数是连续实数的离散化,实际上有一些获得一些极端的正面概率。这是某种形式的离散化错误,几乎可以肯定,这种错误会因模拟中的其他错误而相形见绌。别担心了!
答案 1 :(得分:3)
请注意,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])
答案 2 :(得分:2)
来自numpy.random.random_sample
的文档:
结果来自所述间隔的“连续均匀”分布。要样本 Unif [A,b),b> a 将random_sample的输出乘以
(b-a)
并添加a
:(b - a) * random_sample() + a
Per Sven Marnach的回答,文档可能需要更新以引用numpy.random.uniform
。
答案 3 :(得分:0)
为了确保包含范围 [-1, 1] 的极值,我随机生成了范围 [0, 200000001[.后一个整数的值取决于所需的最终 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 浮点数以避免舍入错误。