Pythonには、ランダムな数値を生成するための標準ライブラリがあります。しかし、その中でもっとも有名なのは、線形合同法を用いた疑似乱数生成器です。このアルゴリズムは非常に高速で、数値計算の分野ではよく使われています。
本記事では、Pythonで疑似乱数生成器を実装し、その性能を評価します。また、Pythonには他にどのようなランダム数値生成の方法があるのかも紹介します。
疑似乱数生成器の実装
疑似乱数生成器は、数列を生成することでランダムな数値を模倣します。そのため、初期値を決めることが必要です。Pythonの標準ライブラリには、この初期値を設定するためのseed関数が用意されています。
import random
random.seed(1234)
これで、疑似乱数生成器が初期化されました。次に、ランダムな数値を生成するにはrandint関数を使います。
x = random.randint(1, 10)
print(x)
ここでは、1から10までの整数をランダムに生成しています。このようにして、Pythonの疑似乱数生成器を簡単に使うことができます。
線形合同法
Pythonの標準ライブラリの疑似乱数生成器は、線形合同法を用いて実装されています。線形合同法は以下の式で表されます。
X_{n+1} = (aX_n + c) mod m
ここで、X_nはn番目の乱数、a、c、mは定数です。この式を繰り返し適用することで、乱数列を生成します。
Pythonの疑似乱数生成器では、a、c、mは以下の値が使われています。
a = 1103515245
c = 12345
m = 2**31
性能の評価
疑似乱数生成器の性能は、生成された乱数列がどの程度ランダムであるかに依存します。Pythonの疑似乱数生成器は、理論的には十分ランダムな数列を生成できるように設計されていますが、実際には偏りがあることが知られています。
そこで、Pythonの疑 似乱数生成器の性能を評価するために、統計的検定を行います。具体的には、乱数列の周期、均等性、独立性を検証します。
周期は、同じ数列が繰り返し現れるまでに生成される乱数の数です。Pythonの疑似乱数生成器の周期は、mとcが互いに素である場合、約mです。すなわち、2**31程度の数列を生成することができます。
均等性は、生成された乱数が一様分布に従っているかどうかを検証する指標です。Pythonの疑似乱数生成器は、randint関数によって生成される乱数が一様分布に従うように設計されているため、この点は問題ありません。
独立性は、生成された乱数が互いに独立であるかどうかを検証する指標です。Pythonの疑似乱数生成器は、前の乱数から次の乱数を生成するため、一定の相関が生じることがあります。しかし、この相関は非常に弱く、一般的な用途では問題になりません。
その他のランダム数値生成方法
Pythonには、疑似乱数生成器以外にも、様々なランダム数値生成方法が用意されています。例えば、randomモジュールには、以下のような関数があります。
random.random(): 0から1までの一様乱数を生成するrandom.uniform(a, b):aからbまでの一様乱数を生成するrandom.gauss(mu, sigma): 平均mu、標準偏差sigmaの正規分布に従う乱数を生成する
これらの関数を組み合わせることで、様々な分布に従うランダム数値を生成することができます。
まとめ
Pythonの疑似乱数生成器は、線形合同法を用いて実装されています。このアルゴリズムは非常に高速で、数値計算の分野ではよく使われています。性能の評価では、周期、均等性、独立性を検証しました。また、Pythonには他にも様々なランダム数値生成方法が用意されていることも紹介しました。