乱数
1. 学習内容
- ❶ 最新の
default_rngジェネレータ API - ❷ 一般的な分布:一様分布、正規分布、整数分布、選択分布
- ❸ 再現性のためのシード設定
- ❹ 無作為抽出:抽出後の補充の有無
- ❺ 旧APIと新API
2. ストーリー
アリスは金融モデルのモンテカルロシミュレーションを実行した。しかし、実行するたびに異なる結果が出てしまい、デバッグが不可能だった。そこでボブが彼女にこう教えた。「default_rng(42)を使ってみて。同じシードを使えば、常に同じ数列が生成される。デバッグ時はシードを指定し、本番環境では指定しないように。」アリスはシードを固定したところ、5分でバグを見つけ出した。
3. 最新版 Generator API
(1) ジェネレータの作成
PYTHON
import numpy as np
# Modern way (recommended)
rng = np.random.default_rng(42) # seed = 42 for reproducibility
# Old way (legacy)
np.random.seed(42)
(2) 一般的な分布
PYTHON
rng = np.random.default_rng(42)
print(rng.random(3)) # 3 uniform [0, 1)
print(rng.normal(0, 1, 3)) # 3 standard normal
print(rng.integers(0, 10, 5)) # 5 integers [0, 10)
print(rng.uniform(0, 10, 3)) # 3 uniform [0, 10)
TEXT
> Output: Run NumPy 2.x in your local Python environment to see the ndarray output. The Piston server does not have NumPy pre-installed — install it locally (`pip install numpy`) and compare. Actual values may vary by NumPy version and random seed.
(3) 無作為抽出
PYTHON
rng = np.random.default_rng(42)
data = np.arange(10)
# With replacement
sample = rng.choice(data, size=5, replace=True)
# Without replacement
sample2 = rng.choice(data, size=5, replace=False)
# Shuffle
rng.shuffle(data) # in-place shuffle
TEXT
> Output: Run NumPy 2.x in your local Python environment to see the ndarray output. The Piston server does not have NumPy pre-installed — install it locally (`pip install numpy`) and compare. Actual values may vary by NumPy version and random seed.
(1) ▶ サンプル:ランダムな分布の生成(難易度 ⭐)
PYTHON
import numpy as np
rng = np.random.default_rng(42)
uniform = rng.random(5)
normal = rng.normal(0, 1, 5)
integers = rng.integers(1, 100, 5)
print("Uniform [0,1):", uniform)
print("Normal N(0,1):", normal)
print("Integers 1-99:", integers)
出力:
TEXT一様分布 [0,1): [0.77395605 0.43887844 0.85859792 0.69736803 0.09417735] 正規分布 N(0,1): [-0.45938412 -0.19865146 0.1113586 -1.00408446 2.02558468] 1~99の整数:[79 64 66 81 96]
(2) ▶ サンプル:抽出方法(無戻り・有戻り)(難易度 ⭐⭐)
PYTHON
import numpy as np
rng = np.random.default_rng(42)
data = np.arange(20)
# With replacement — same element can appear multiple times
with_repl = rng.choice(data, size=10, replace=True)
print("With replacement:", with_repl)
# Without replacement — all elements are unique
without_repl = rng.choice(data, size=10, replace=False)
print("Without replacement:", without_repl)
# Shuffle in-place
rng.shuffle(data)
print("Shuffled data:", data)
出力:
TEXT置換後:[ 6 19 9 12 6 15 0 7 3 14] 重複なし:[13 10 8 11 5 1 9 16 18 4] シャッフルされたデータ:[ 8 7 13 10 18 3 15 5 14 16 0 9 2 1 11 17 12 19 6 4]
(3) ▶ サンプル:シードを用いた再現可能なシーケンス(難易度 ⭐)
PYTHON
import numpy as np
# Same seed = same sequence
rng1 = np.random.default_rng(123)
rng2 = np.random.default_rng(123)
print("rng1:", rng1.random(4))
print("rng2:", rng2.random(4))
# Different seed = different sequence
rng3 = np.random.default_rng(456)
print("rng3:", rng3.random(4))
出力:
TEXTrng1: [0.18701985 0.68208779 0.60135938 0.51034031] rng2: [0.18701985 0.68208779 0.60135938 0.51034031] rng3: [0.59831648 0.72572267 0.04819845 0.35980509]
Q なぜ
np.random.seed ではなく default_rng を使うのですか?A
default_rng は独立した Generator オブジェクトを作成するため、複数の独立したストリームを持つことができます。 np.random.seedは、すべてのコードに影響を与えるグローバルなシードを設定しますが、これは不安定であり、モジュール間の干渉を引き起こす可能性があります。Q 再現性のある結果を得るにはどうすればよいですか?
A 固定のシード
rng = np.random.default_rng(42) を指定してください。同じシードを使用すると、常に同じシーケンスが生成されます。実行ごとに異なるシードを使用してください。Q
random と uniform の違いは何ですか?A
rng.random(size) は [0, 1) の範囲の値を返します。rng.uniform(low, high, size) は [low, high) の範囲の値を返します。 randomはuniform(0, 1)の特殊なケースです。❓ よくある質問
Q 最も重要なポイントは何か?
A NumPyの演算はベクトル化されているため、パフォーマンスを向上させるにはPythonのループは避けるべきだ。
Q さらに詳しく知りたい場合はどうすればよいですか?
A 詳細なリファレンスや高度なトピックについては、numpy.org の NumPy 公式ドキュメントをご覧ください。
Q これはNumPy 2.xでも動作しますか?
A はい。すべての例はNumPy 2.xと互換性があります。一部の古いAPI(np.random.seedなど)は引き続きサポートされていますが、最新の代替APIの使用を推奨します。
📖 まとめ
- 最新のGenerator APIを使用する場合は、
np.random.default_rng(seed)を使用してください - 一般的な分布:
random、normal、integers、uniform、choice - 再現性のある結果を得るために、RNGの初期化を行ってください
shuffleはその場で変更を行います;choiceは、置換あり/なしのサンプリングを行います- 旧バージョンの
np.random.seed()はまだ動作しますが、レガシー版です。default_rngをお勧めします。
📝 練習問題
-
初心者 (難易度 ⭐):
default_rng(42)を使用して、ランダムな浮動小数点数 10 個、ランダムな整数(0~100)10 個、および正規分布に従う数値 10 個を生成してください。それらを出力してください。 -
中級(難易度 ⭐⭐):正規分布から1000個の乱数を生成する。それらの平均と標準偏差を計算する。それらがおよそ0と1になることを確認する。
-
上級(難易度 ⭐⭐⭐):100件のデータセットから10件のサンプルを抽出するために、
rng.choiceを「重複あり」と「重複なし」の両方で使用してください。それぞれの違いと、どのような場合にどちらを使用するかを説明してください。