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

【Unity】アセットストアにあるアセットを追加・使用する方法

この記事では、Unityのアセットストア…

1日 ago

【Unity】値が変更された際に処理を実行したい

この記事では、値が変更された際に何かしら…

3日 ago

【Unity】クラスのパラメータをインスペクターから調整したい

この記事では、定義したクラスをインスペク…

4日 ago

【Unity】スプライト(画像)を差し替える方法

この記事では、Unityでスプライト(画…

5日 ago

【Pyhton】スタックやキューのように扱えるdeque(デック)の使い方

この記事では、スタックやキューのように扱…

3か月 ago

【Python】Queue(キュー)の種類と使い方

この記事では、PythonのQueue(…

3か月 ago