当確率ではないランダム
サイコロのように当確率で目がでるのではなく、おみくじのように出現確率が変化するようなプログラムが必要になったので作成した。
実際にうまく言っているかを確認するため、ヒストグラムを表示させた。
weighted_random関数
- 入力:Numpyの配列に重み付けをした数値を入れる(合計が1である必要はない)
- 出力:ランダムな値(0~配列長-1)を返す
import numpy as np import matplotlib.pyplot as plt # 入力データ(それぞれ、10%,30%,60%) data = np.array([0.1, 0.3, 0.6]) # 関数 def weighted_random(data): # 累積 culm = [0] * data.shape[0] total = np.sum(data) for i in range(data.shape[0]): cuml[i] = np.sum(data[:i+1]) / total # 乱数から選択 s = np.random.rand() m = 0 for i in cuml: if s < i: break m += 1 return m # 表示 x = np.array([weighted_random(data) for _ in range(1000)]) plt.hist(x, rwidth=1.0, bins=3)
1000個の結果から見て大体100個、300個、600個程度の出力を得ている。 なんかもっと綺麗に書けないんだろうか。