23

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

到目前为止,我使用过:

2 * numpy.random.rand() - 1

并且:

2 * numpy.random.random_sample() - 1
4

4 回答 4

33

你的方法很好。另一种方法是使用函数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。由于浮点数是连续实数的离散化,因此实际上有一些正概率得到一些极端。这是某种形式的离散化误差,几乎可以肯定,这个误差会被模拟中的其他误差所抵消。别担心了!

于 2012-07-26T15:50:47.217 回答
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])
于 2014-08-30T13:55:46.107 回答
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.

于 2012-07-26T15:50:56.003 回答
0

为了确保包含范围 [-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 浮点数以避免舍入错误。

于 2020-12-29T08:13:29.600 回答