乱数生成とシミュレーション

NumPy入門⑨ 乱数生成とシミュレーション

乱数生成の基本

NumPyは乱数を扱うための機能を豊富に備えており、シミュレーションや統計モデリングに活用できます。
乱数は np.random モジュールを通して生成します。

import numpy as np

一様乱数

0〜1の範囲で一様に分布する乱数を生成します。

# 0〜1の乱数を10個
print(np.random.rand(10))

# 2行3列の乱数行列
print(np.random.rand(2, 3))

正規分布(ガウス分布)

平均0、標準偏差1の正規分布に従う乱数を生成します。

print(np.random.randn(5))    # 1次元配列
print(np.random.randn(2, 3)) # 2次元配列

任意の整数乱数

指定範囲の整数をランダムに生成します。

# 0〜9の乱数を5個
print(np.random.randint(0, 10, 5))

サンプル抽出

配列からランダムに要素を抽出できます。

arr = np.arange(10)

# ランダムに3個選択
print(np.random.choice(arr, 3))

# 重複なしサンプリング
print(np.random.choice(arr, 3, replace=False))

乱数シードの固定

シードを固定することで、毎回同じ乱数を生成できます。
再現性が必要なシミュレーションでは重要です。

np.random.seed(42)
print(np.random.rand(3))  # 常に同じ結果になる

シミュレーション例① サイコロ

6面サイコロを1000回振った結果をシミュレーションします。

dice = np.random.randint(1, 7, 1000)
print(np.unique(dice, return_counts=True))

シミュレーション例② モンテカルロ法による円周率の近似

点をランダムに打ち、円の内外に入る割合でπを近似します。

n = 100000
x = np.random.rand(n)
y = np.random.rand(n)

inside = (x**2 + y**2) <= 1
pi_estimate = 4 * np.sum(inside) / n

print("推定した円周率:", pi_estimate)

まとめ

  • rand, randn, randint で一様乱数・正規乱数・整数乱数を生成可能
  • choice でサンプル抽出、seed で再現性を確保できる
  • サイコロやモンテカルロ法などシミュレーションに応用できる