Python|乱数シードを固定する:random.seed(), numpy.random.seed()

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以降の推奨スタイル

再現性が求められる場面では、これらの関数が非常に役立ちます。特に機械学習・統計処理など実務的な場面では、毎回同じ条件で結果を得ることが信頼性のカギです。学習のコツとしては、「ランダム処理を含むコードを書くときは、必ずシードも考える」という習慣をつけておくと良いでしょう。

タイトルとURLをコピーしました