1. はじめに
Pythonでランダムな値を扱う際、random
モジュールやnumpy.random
モジュールを使うことが多いですが、「毎回違う結果になると困る」という場面もあります。例えば、機械学習のモデル検証やデータのシャッフル処理では、同じランダム結果を再現できることが重要です。
そんなときに活躍するのが、random.seed()
やnumpy.random.seed()
を使って乱数のシード(種)を固定する方法です。本記事では、Python初心者〜中級者を対象に、これらの関数の使い方と実践的な応用例、注意点について丁寧に解説します。
2. Pythonにおける乱数シードの基本:random.seed(), numpy.random.seed()
2.1 乱数シードとは?
乱数シードとは、乱数生成の初期値を指します。コンピュータの乱数は完全な「ランダム」ではなく、実際には特定の計算アルゴリズムに基づいた「擬似乱数(pseudo random)」です。シード値を指定することで、乱数の「開始地点」が決まり、同じシード値であれば毎回同じ乱数列が得られるようになります。
2.2 random.seed() の使い方
Python標準のrandom
モジュールでは、random.seed()
を使ってシードを固定できます。
import random
random.seed(42) # シードを固定
print(random.randint(1, 100))
print(random.randint(1, 100))
実行結果:
82
15
上記のコードは何度実行しても、常に「82」と「15」が出力されます。
2.3 numpy.random.seed() の使い方
NumPyの乱数生成でも同様にシードを固定することができます。ただし、numpy.random
には独自の乱数生成システムがあるため、random.seed()
とは別にnumpy.random.seed()
を使う必要があります。
import numpy as np
np.random.seed(42)
print(np.random.randint(1, 100))
print(np.random.randint(1, 100))
実行結果:
52
93
こちらも何度実行しても、同じ結果になります。
3. よくある使い方・応用例
3.1 実験再現性の確保(研究や検証時)
機械学習や統計シミュレーションなどで、データの分割や重みの初期化を毎回同じ状態で始めたい場合にシードを固定します。
import random
random.seed(0)
data = [1, 2, 3, 4, 5]
random.shuffle(data)
print(data)
実行結果:
[4, 5, 1, 3, 2]
シャッフル結果も、シードを固定すれば常に同じ並びになります。
3.2 モデル評価の公平性
例えば、機械学習で複数のモデルを比較する場合、ランダムなトレーニング/テスト分割が毎回変わると不公平です。シードを使えば同一条件での評価が可能になります。
3.3 np.random.default_rng()との違い
NumPy 1.17以降では、np.random.default_rng()
の使用が推奨されています。従来のnp.random.seed()
はグローバルステートを持つため、再現性の担保が難しくなるケースがあります。
import numpy as np
rng = np.random.default_rng(42)
print(rng.integers(1, 100))
print(rng.integers(1, 100))
実行結果:
87
75
このように、rng
オブジェクトを使うことで、より局所的で安全な乱数生成が可能です。
4. 注意点・エラー対策
4.1 randomとnumpyはシードが別物
random.seed()
はrandom
モジュール専用、numpy.random.seed()
はNumPy専用です。片方だけ設定してももう一方には影響しません。
4.2 シードを固定しないと毎回結果が変わる
シードを指定しなければ、実行のたびに異なる結果になります。再現性が必要な場合は必ず明示的に設定しましょう。
4.3 default_rng()は他と互換性がない
default_rng()
を使う場合、従来のnp.random.seed()
との互換性はありません。新しい書き方に統一するようにしましょう。
4.4 デバッグ時はシード固定が便利
コードの挙動がランダム性によって変わる場合、バグの再現が難しくなることがあります。デバッグ中は一時的にシードを固定すると、再現性が保たれて調査がしやすくなります。
5. まとめ
今回は、Pythonで乱数のシードを固定する方法として、random.seed()
とnumpy.random.seed()
を中心に解説しました。
random.seed()
:標準のrandom
モジュールで使うnumpy.random.seed()
:NumPyの乱数生成に使用default_rng()
:NumPy 1.17以降の推奨スタイル
再現性が求められる場面では、これらの関数が非常に役立ちます。特に機械学習・統計処理など実務的な場面では、毎回同じ条件で結果を得ることが信頼性のカギです。学習のコツとしては、「ランダム処理を含むコードを書くときは、必ずシードも考える」という習慣をつけておくと良いでしょう。