2016-05-23 9 views
3

合計を表す数字があるとします。つまり、123,456,789としましょう。numpy - 数値を指定すると、ファジー重み付きの合計数を見つけます

ここで、その数になるがファジー重みを持つ数を生成したいとします。

たとえば、3つの数字を生成したいとします。最初は、合計の約60%であるべきですが、少しのばらつきがあります。 2番目の値は合計値の30%になるはずです。そして、3番目のものは他の2つに応じて約10%になります。

私は、このようにそれをやってみました:

percentages = [0.6, 0.3] 
total = 123456789 
still_need = total 
values = [] 
for i in range(2): 
    x = int(total * (percentages[i] + np.random.normal(scale=0.05))) 
    values.append(x) 
    still_need = still_need - x 
values.append(still_need) 

しかし、それは非常にエレガントないないようです。

良い方法がありますか?それを行うには

答えて

3

きれいな方法は、この場合multinomial distribution

total = 123456789 
percentages = [0.6, 0.3, 0.1] 
values = np.random.multinomial(total, percentages) 

から引き出すことであろう、3両面をロール多項分布モデルを上げ、各顔の確率がある123456789回、死にます[0.6,0.3,0.1]。 multinomial()と呼ぶことは、この実験の単一の試行を実行するようなものです。これは合計123456789の3つのランダムな整数を返します。これは、ダイの各面が上がった回数を表します。複数の描画が必要な場合は、sizeパラメータを使用できます。

+0

'np.random.multinomial'は基本機能を123,456,789回呼び出しますか?私は '%timeit'を実行しましたが、それは非常に高速です。 – jawns317

+0

ほとんど確かではありません。幸いにも、多項式乱数を生成する効率的な方法があります。私はNumPyが何を使用しているのか分かりません。しかし、例えば、Devroye(1986)「非一様乱数生成」を参照してください。彼は、多項式乱数を生成する方法を、二項乱数列(生成するのが速い)として示しています。この方法での1回の描画では、d面のダイに対してO(d)時間がかかります。 – user20160

関連する問題