2025年2月17日月曜日

Pythonで乱数を発生させる際に、毎回異なる乱数を得る方法は

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モジュールを使用します。

これらの方法を適切に使い分けることで、目的に合った乱数生成を行うことができます。