この記事では、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