Categories: Python

【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 

実行結果

平均値: 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 

実行結果

平均値: 50.36802967331485
±5: 67, ±10: 96
ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago