1. ホーム
  2. python

[解決済み] 和が1になるような乱数のリストを生成する。

2022-11-09 05:59:29

質問

  • この質問は、以下の質問と重複するものではありません。 合計がMであるN個の乱数を取得する なぜなら
    1. ほとんどの の回答は理論に関するものであり、この質問に答えるためのpythonでの具体的なコーディングソリューションではありません。
    2. ここで受け入れられた答えは、この質問に答える重複した1つの答えよりも5年古いです。
    3. 重複して受理された回答は、この質問に回答していません。

N個(100個)の乱数の和が1になるようなリストを作るにはどうしたらよいでしょうか?

で乱数のリストを作ることができます。

r = [ran.random() for i in range(1,100)]

リストの合計が1になるように、どのようにこれを修正すればよいでしょうか(これは確率シミュレーションのためです)。

どのように解決するのですか?

最も簡単な方法は、N個のランダムな値を取り、その合計で割ることです。

より一般的な解決策は ディリクレ分布 であり numpyで利用可能です。 .

分布のパラメータを変更することで、個々の数値のquot;randomness"を変更することができます。

>>> import numpy as np, numpy.random
>>> print np.random.dirichlet(np.ones(10),size=1)
[[ 0.01779975  0.14165316  0.01029262  0.168136    0.03061161  0.09046587
   0.19987289  0.13398581  0.03119906  0.17598322]]

>>> print np.random.dirichlet(np.ones(10)/1000.,size=1)
[[  2.63435230e-115   4.31961290e-209   1.41369771e-212   1.42417285e-188
    0.00000000e+000   5.79841280e-143   0.00000000e+000   9.85329725e-005
    9.99901467e-001   8.37460207e-246]]

>>> print np.random.dirichlet(np.ones(10)*1000.,size=1)
[[ 0.09967689  0.10151585  0.10077575  0.09875282  0.09935606  0.10093678
   0.09517132  0.09891358  0.10206595  0.10283501]]

ディリクレ分布は主要なパラメータによって、すべての値が1./N(Nはベクトルの長さ)に近いベクトルを与えるか、ベクトルの値のほとんどが〜0、1が1つあるベクトルを与えるか、それらの中間のものを与えるかのいずれかになります。

編集 (オリジナルの回答から5年後)。ディリクレ分布に関するもう一つの有用な事実は、ガンマ分布の確率変数の集合を生成し、それらの合計で割ると、自然にそれが得られるということです。