Python PR

【Python】平均と標準偏差から乱数を生成する

記事内に商品プロモーションを含む場合があります

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