1. シード値の利用
乱数生成器は、シード値と呼ばれる初期値をもとに乱数を生成します。通常、Pythonでは現在のシステム時刻がシード値として使われるため、プログラムを実行するたびに異なる乱数系列が得られます。
Python
import random
# 現在のシステム時刻がシード値として使われるため、実行ごとに異なる乱数が生成される
print(random.random())
print(random.random())
2. random.seed() による明示的な初期化
random.seed()
関数を使うと、乱数生成器のシード値を明示的に設定できます。しかし、毎回異なる乱数を得るためには、シード値も変化させる必要があります。
Python
import random
import time
# 現在の時刻をシード値として使う
random.seed(time.time())
print(random.random())
print(random.random())
3. secretsモジュール (Python 3.6以降)
Python 3.6以降では、secrets
モジュールを使うことで、暗号学的に安全な乱数を生成できます。secrets
モジュールは、予測不可能な乱数を生成する必要がある場合に使われます。
Python
import secrets
# ランダムな整数を生成
print(secrets.randbelow(10))
# ランダムなURL安全な文字列を生成
print(secrets.token_urlsafe(32))
補足
- 乱数生成器は、完全にランダムな数を生成しているわけではありません。実際には、決定論的なアルゴリズムに基づいて擬似乱数を生成しています。
- 乱数生成のアルゴリズムやシード値の管理方法によっては、生成される乱数列に偏りや規則性が見られる場合があります。
まとめ
Pythonで毎回異なる乱数を生成するには、主に以下の方法があります。
- デフォルトの動作: 何も設定しなければ、現在のシステム時刻がシード値として使われるため、実行ごとに異なる乱数が生成されます。
- random.seed(): 現在時刻をシード値として与えることで、よりランダムに近い乱数を生成できます。
- secretsモジュール: 暗号学的に安全な乱数が必要な場合は、
secrets
モジュールを使用します。
これらの方法を適切に使い分けることで、目的に合った乱数生成を行うことができます。