この記事では、Pythonモジュール「NumPy」で乱数(ランダム)の出し方を簡単に偏らせる方法をソースコード付きで紹介します。
乱数の偏らせ方
NumPyでは、「numpy.random.rand」を使って一様乱数(0~1の実数値)を生成できます。
NumPyでは、F分布など様々な確率分布に従った乱数生成ができますが、もっと簡単な方法で乱数の出し方を偏らせることができます。
ゲームなどで活用できるテクニックです。
ヒストグラム(一様乱数)
①小さい値の出現回数を増やす
まずは、小さい値の出現回数を増やすテクニックです。
一様乱数同士を掛け合わせることで0に近い値ほど、出現回数が高くなります。
掛け合わせる回数を増やすほど、その効果も高くなります。
コード例
numpy.random.rand(N) * numpy.random.rand(N)
ヒストグラム
②大きい値の出現回数を増やす
次に、大きい値の出現回数を増やすテクニックです。
①を応用し、「1 – (一様乱数同士を掛け合わせた値)」を計算すれば逆に大きい値の出現回数を増やせます。
コード例
1 - (numpy.random.rand(N) * numpy.random.rand(N))
ヒストグラム
③中央値(0.5)付近の出現回数を増やす
最後に中央値の出現回数を増やすテクニックです。
一様乱数同士を加算し、2で割ると中央値に近い値ほど、出現回数が高くなります。
加算回数を増やすほど、その効果も高くなります。(3回足したら3で割ります)
コード例
(numpy.random.rand(N) + numpy.random.rand(N))/2
ヒストグラム
ソースコード
サンプルプログラムのソースコードです。
# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt def main(): # サンプル数 N = 500 # 乱数配列を生成(0~1の実数) x1 = np.random.rand(N) x2 = np.random.rand(N) #y = x1 # 一様に分布 #y = x1 * x2 # 小さい値ほど、出現率が高い #y = 1 - (x1 * x2) # 大きい値ほど出現回数が高い y = (x1 + x2)/2 # 中央値(0.5)に近い値ほど、出現率が高い # ヒストグラムの算出 hist, bins = np.histogram(y,N,[0,1]) # ビンの末尾を削除して配列のサイズをhistと揃える bins = np.delete(bins, -1) # グラフ表示 plt.xlim(0, 1) # x軸の範囲 plt.ylim(-5, 20) # y軸の範囲 plt.scatter(bins, hist, s=5) # 散布図 plt.xlabel("Value") plt.ylabel("Number of occurrences") plt.grid() plt.show() if __name__ == '__main__': main()
コメント