乱数

1. 学習内容



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))

出力:

TEXT
rng1: [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 randomuniform の違いは何ですか?
A rng.random(size) は [0, 1) の範囲の値を返します。rng.uniform(low, high, size) は [low, high) の範囲の値を返します。 randomuniform(0, 1)の特殊なケースです。

❓ よくある質問

Q 最も重要なポイントは何か?
A NumPyの演算はベクトル化されているため、パフォーマンスを向上させるにはPythonのループは避けるべきだ。
Q さらに詳しく知りたい場合はどうすればよいですか?
A 詳細なリファレンスや高度なトピックについては、numpy.org の NumPy 公式ドキュメントをご覧ください。
Q これはNumPy 2.xでも動作しますか?
A はい。すべての例はNumPy 2.xと互換性があります。一部の古いAPI(np.random.seedなど)は引き続きサポートされていますが、最新の代替APIの使用を推奨します。

📖 まとめ



📝 練習問題

  1. 初心者 (難易度 ⭐): default_rng(42) を使用して、ランダムな浮動小数点数 10 個、ランダムな整数(0~100)10 個、および正規分布に従う数値 10 個を生成してください。それらを出力してください。

  2. 中級(難易度 ⭐⭐):正規分布から1000個の乱数を生成する。それらの平均と標準偏差を計算する。それらがおよそ0と1になることを確認する。

  3. 上級(難易度 ⭐⭐⭐):100件のデータセットから10件のサンプルを抽出するために、rng.choiceを「重複あり」と「重複なし」の両方で使用してください。それぞれの違いと、どのような場合にどちらを使用するかを説明してください。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%