この記事では、Python で指定した正規分布の平均と標準偏差通りになる乱数を生成する方法を解説します。
スポンサーリンク
平均と標準偏差から乱数を1つ生成
randomモジュール の gauss()関数 を使うことで正規分布の平均と標準偏差を用いて乱数を 1つ生成することができます。randomモジュール は標準ライブラリです。
import random random.gauss(mu, sigma)
| mu | 平均 |
|---|---|
| sigma | 標準偏差 |
マルチスレッドで同時に使用したい場合は random.normalvariate()関数 を使う。こちらの関数は gauss() に比べて遅いがスレッドセーフです。
import random random.normalvariate(mu, sigma)
サンプル
平均 50、標準偏差 5 の乱数を 100個生成し、50 ± 5 に 約68%、50 ± 10 に 約95% の データになっているか確認してみます。ついでに平均値も確認してみます。
import random import statistics # 乱数を格納するリスト l = [] # カウント n68 = 0 n95 = 0 # 100回繰り返す for _ in range(100): # 平均50,標準偏差5の乱数の生成 r = random.gauss(50, 5) # 40以上60以下の判定 if 40 <= r <= 60: n95 += 1 # 45以上55以下の判定 if 45 <= r <= 55: n68 += 1 l.append(r) # 出力 print(f'平均値: {statistics.mean(l)}') print(f'±5: {n68}, ±10: {n95}')
実行結果
平均値: 50.416095684999284 ±5: 68, ±10: 97
百回だと結構ブレる。試行回数を千回、万回に増やすことでかなり確率通りになる。
平均と標準偏差から乱数を複数生成
NumPy の random.normal()メソッド を使うことで正規分布の平均と標準偏差を用いて乱数を任意の数だけ生成することができます。
numpy.random.normal(loc=0.0, scale=1.0, size=None)
| loc | 平均 |
|---|---|
| scale | 標準偏差 |
| size | 生成する乱数の個数。タプルで指定することで多次元配列として受け取ることができる。 |
NumPy 1.17以降では、Generatorクラス を用いた方法が推奨されている。使い方は numpy.random.default_rng() で生成した Generatorクラス のオブジェクトから normal()メソッド を同じように呼び出すだけです。
# Generatorクラスのオブジェクト生成 rng = np.random.default_rng() rng.normal(loc=0.0, scale=1.0, size=None)
サンプル
先ほどのサンプルコードを NumPy を使って書き換えてみます。
import numpy as np n68 = 0 n95 = 0 # Generatorクラスのオブジェクト生成 rng = np.random.default_rng() # normalメソッドの呼び出し rs = rng.normal(50, 5, 100) for r in rs: # 40以上60以下の判定 if 40 <= r <= 60: n95 += 1 # 45以上55以下の判定 if 45 <= r <= 55: n68 += 1 # 出力 print(f'平均値: {rs.mean()}') print(f'±5: {n68}, ±10: {n95}')
実行結果
平均値: 50.36802967331485 ±5: 67, ±10: 96


