概要(numpy randomは「乱数で“試す・検証する・生成する”」ための基礎道具)
NumPyの乱数は、データのシミュレーション、重みの初期化、サンプリング、シャッフル、ノイズ付与などに使います。初心者がまず覚えるべきは「新しい乱数生成器(Generator)を使う」「シードで再現性を確保する」「分布(uniform/normal/poisson など)を選ぶ」「形状(shape)を正しく指定する」の4点です。これだけで、ほぼすべての乱数タスクを安全にこなせます。
基本の使い方(Generatorの作成、シード、形状)
新しい乱数生成器(default_rng)を使う
import numpy as np
rng = np.random.default_rng() # 推奨:新しいGenerator
x = rng.random(5) # [0,1) 一様乱数 1次元(長さ5)
m = rng.random((2, 3)) # 2×3の行列
print(x, m.shape)
Pythonnp.random.default_rngで作る「rng」が現代的で安全。古いnp.random.randn/seedより、再現性・性能・API整合性に優れています。
シードで再現性を持たせる
rng1 = np.random.default_rng(42)
rng2 = np.random.default_rng(42)
print(rng1.random(3), rng2.random(3)) # 同じシードなら同じ列が出る
Pythonシードは「同じ乱数を再現」する鍵。テスト・チュートリアル・論文再現に必須です。
形状(size/tuple)で欲しい形に出力する
rng = np.random.default_rng(0)
a1 = rng.random(10) # 1次元 長さ10
a2 = rng.random((3, 4)) # 2次元 3×4
a3 = rng.integers(0, 10, (2,3))# 整数 0〜9の2×3
Pythonsizeに整数やタプルを渡すだけ。誤りやすいのは「(n,) と n の違い」ですが、どちらでも一次元ベクトルになります。
よく使う分布(uniform・normal・integers・choice・permutation)
一様分布(0〜1、任意範囲の連続値)
rng = np.random.default_rng(1)
u01 = rng.random((2, 5)) # [0, 1) 一様
uab = rng.uniform(10, 20, 5) # [10, 20) 一様
Pythonランダム初期化や一様サンプリングに使います。uniformは下端・上端を指定。
正規分布(ガウス、平均と標準偏差で指定)
rng = np.random.default_rng(2)
g = rng.normal(loc=0.0, scale=1.0, size=(3, 3)) # 平均0, 標準偏差1
w = rng.normal(100, 15, 1000) # 例:体重のモデル
Python誤差やノイズのモデル化、確率的勾配法の初期化に頻出。scaleは標準偏差です。
整数乱数(範囲の整数)
rng = np.random.default_rng(3)
z = rng.integers(low=0, high=10, size=8) # 0〜9の整数
even = rng.integers(0, 50, (2,3)) # 0〜49の2×3
Pythonラベル付け、インデックス選択、サイコロ的な整数値生成に。
choice(配列からランダム抽出、重み付きも可能)
rng = np.random.default_rng(4)
items = np.array(["A", "B", "C", "D"])
pick = rng.choice(items, size=5, replace=True) # 5件抽出(重複あり)
weighted = rng.choice(items, size=5, p=[0.1, 0.2, 0.3, 0.4]) # 重み付き
Python任意集合からのサンプリング。pで確率重みを指定できます。
permutation/shuffle(順序のランダム化)
rng = np.random.default_rng(5)
arr = np.arange(10)
perm = rng.permutation(arr) # ランダム並べ替えの“結果”を返す
rng.shuffle(arr) # “その場で”シャッフル
Python学習データのシャッフルやクロスバリデーション分割で定番です。
応用の分布(binomial・poisson・exponential・beta/dirichlet)
二項分布(成功回数のモデル)
rng = np.random.default_rng(6)
# n回試行、成功確率pの成功回数
b = rng.binomial(n=10, p=0.3, size=1000)
Pythonクリック数や成功回数の確率モデルに。
ポアソン分布(到着/発生回数のモデル)
rng = np.random.default_rng(7)
# 平均到着率 lam のカウント
p = rng.poisson(lam=2.5, size=1000)
Pythonアクセス到着数、イベント発生数の自然なモデルです。
指数分布(待ち時間モデル)
rng = np.random.default_rng(8)
e = rng.exponential(scale=5.0, size=1000) # 平均5の待ち時間
Python到着間隔や寿命のモデル化に使います。
ベータ/ディリクレ(確率の事前分布)
rng = np.random.default_rng(9)
beta = rng.beta(a=2.0, b=5.0, size=1000) # 0〜1の確率の形状制御
dirch = rng.dirichlet(alpha=[1, 1, 1]) # カテゴリ確率のベクトル
Python確率・比率の事前分布として、ベイズやA/Bテストに便利です。
重要ポイントの深掘り(旧APIとの違い、再現性、ベクトル化、検証)
旧API(np.random.*)との違いと移行のコツ
- default_rngで「Generator」を作ってメソッドを呼ぶのが新標準です。
- 旧式のnp.random.seed/np.random.randnなどは避け、rng.normal/rng.integers/rng.choiceへ置き換えます。
- 大規模・並列処理での品質、再現性制御、分布APIの一貫性が向上します。
再現性は「シード+一貫した呼び出し順」で守る
- 同じseedを同じ順序で使えば、同じ乱数列になります。
- 実験コードは「rngを関数に渡す」設計にすると、隠れたグローバル状態を避けられます。
ベクトル化で高速・簡潔に
- size=(形状)を指定して「まとめて」生成するのが基本。ループで1個ずつ出さない。
- サンプリング後の処理もできる限り配列演算(ブロードキャスト)へ。
検証は「分布の形」をプロットで確認
import matplotlib.pyplot as plt
rng = np.random.default_rng(42)
x = rng.normal(0, 1, 10000)
plt.hist(x, bins=50, density=True)
plt.title("Normal(0,1) distribution check")
plt.show()
Python設計どおりの分布か、ヒストグラムや密度曲線で確認してから本番に使うと事故が減ります。
実践例(データ分割、ブートストラップ、ノイズ付与、重み初期化)
学習・検証のランダム分割(シード固定で再現)
rng = np.random.default_rng(123)
n = 100
indices = rng.permutation(n)
train_idx, test_idx = indices[:80], indices[80:]
Pythonpermutationでランダム分割。seedを固定して比較可能にします。
ブートストラップ(復元抽出で信頼区間推定)
rng = np.random.default_rng(0)
data = rng.normal(100, 15, 200)
boots = rng.choice(data, size=(1000, len(data)), replace=True)
means = boots.mean(axis=1)
ci_low, ci_high = np.percentile(means, [2.5, 97.5])
Python復元抽出で統計量のばらつきを評価。意思決定に強い補助線を引けます。
ノイズ付与でロバスト化(正規ノイズ)
rng = np.random.default_rng(10)
X = np.linspace(0, 10, 100)
y = 2*X + 1 + rng.normal(0, 0.5, size=X.shape) # 0.5のノイズ
Pythonシミュレーションやモデルのテストに。意図的なノイズで過学習対策の検証もできます。
重み初期化(小さな一様/正規)
rng = np.random.default_rng(11)
W = rng.normal(0, 0.01, size=(128, 64)) # 小さな正規乱数
B = rng.uniform(-0.001, 0.001, size=64) # 小さな一様乱数
Python初期値の分布とスケールは学習安定性に直結します。
まとめ(「Generatorを使う」「シードで再現」「分布とshapeを正しく指定」)
numpy randomは、乱数の設計と再現性が命です。default_rngでGeneratorを作り、seedで再現性を確保し、目的に合う分布(uniform/normal/poisson/binomial など)を選び、sizeで形状を一発指定する。choiceやpermutationでサンプリング・並べ替え、必要なら重み付きや復元抽出も駆使する。これらの型を身につければ、初心者でも“正しく試せる”乱数駆動のデータ処理・検証が安定して書けます。
