web-dev-qa-db-ja.com

NumPyで乱数を取得する最良の方法は何ですか?

-1, 1の範囲の乱数を生成し、それぞれの生成確率が等しくなるようにします。つまり私は両極端が出てくる可能性が低くなることを望んでいません。これを行う最善の方法は何ですか?

これまでのところ、私は使用しています:

2 * numpy.random.Rand() - 1

また:

2 * numpy.random.random_sample() - 1
22
wot

あなたのアプローチは問題ありません。別の方法は、関数 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])

極値の確率に関して:理想化された連続乱数の場合、極値の1つを取得する確率は0になります。浮動小数点数は連続実数の離散化であるため、実際には、極限のいくつかを取得します。これは何らかの形式の離散化エラーであり、このエラーがシミュレーションの他のエラーによってd化されることはほぼ確実です。心配しないで!

32
Sven Marnach

ご了承ください - numpy.random.Rand は、1回の呼び出しで均一な分布から複数のサンプルを生成できます。

>>> 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
Adobe

numpy.random.random_sample のドキュメントから:

結果は、指定された間隔にわたる「連続的な均一」分布からのものです。 Unif [A、b)をサンプリングするには、b> arandom_sampleの出力に(b-a)を掛け、aを追加します。

 (b - a) * random_sample() + a

Sven Marnachの答えによれば、ドキュメントはおそらく numpy.random.uniform を参照するように更新する必要があります。

2
ecatmur