Pythonで正規分布の乱数を生成する

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
最終更新 2024-05-15

広告

本記事はお役に立てたでしょうか。本ブログでは匿名でのコメントや少額から(15円~)の寄付などを受け付けております。もしお役に立てたのであればご支援いただけると大変励みになります。

Built with Hugo
テーマ StackJimmy によって設計されています。