Pyhtonで乱数を得るには標準ライブラリの random
を使うのが一般的ではないでしょうか。正規分布(ガウス分布)に従う乱数を得るのもNumPyやSciPyなどを使う必要はなく、標準ライブラリで実現可能です。
コード
標準ライブラリの中の random.gauss()
関数を使います。
import random
r = random.gauss(mu=0.0, sigma=1.0)
参考: https://docs.python.org/ja/3/library/random.html#random.gauss
ここで mu
は平均($\mu$)、sigma
は標準偏差($\sigma$)です。
実行例
このコードで生成した数のヒストグラムは以下のようになります。サンプル数が増えるほど綺麗な山型になるのがわかります。
サンプル数: 1000
サンプル数: 10000
サンプル数: 100000
μとσの設定
標準偏差は$\mu$と$\sigma$という2つのパラメータにより定義されます。$\mu$は平均なのでわかりやすいかと思います。正規分布の山の真ん中がどこに来るかですね。$\sigma$は山の広がり具合を表します。詳細は省きますが、広がり具合の目安として確率分布関数は以下の性質を持ちます。
- $\mu \pm \sigma$ の範囲にある確率が約68%
- $\mu \pm 2 \sigma$ の範囲にある確率が約95%
- $\mu \pm 3 \sigma$ の範囲にある確率が約99.7%
例えばある範囲の中で正規分布に従って乱数を生成したい、と思ったら$\pm 3 \sigma$にちょうどその範囲が来るようにすると範囲指定と正規分布を兼ねたような乱数生成が可能です(ただし厳密には正規分布ではないのでご注意ください)。
import random
def random_gauss_range(min_val, max_val):
mu = (min_val+max_val)/2
sigma = (max_val-min_val)/6
while True:
r = random.gauss(mu, sigma)
if min_val <= r and r <= max_val:
break
return r