擬似乱数
擬似乱数(ぎじらんすう、pseudorandom numbers)とは、乱数列(乱数)のように見えるが、実際には確定的な計算によって求めている数列に含まれる数を指す。擬似乱数を生成する機器を擬似乱数生成器、生成アルゴリズムを擬似乱数生成法と呼ぶ。
真の乱数は本来規則性も再現性も無いために予測は不可能である(例:サイコロを振る時、今までに出た目から次に出る目を予測するのは不可能)。一方、擬似乱数は計算によって作るので、生成される数列は確定的である。また、生成法と内部状態が既知であれば、予測可能でもある。
仮説検定により、ある擬似乱数列が、乱数列といえるような性質を満たしているかどうかを確認することを擬似乱数の検定と言う。
一般に、一般のシミュレーション等には十分な性能を持った擬似乱数生成法であっても、暗号の応用には不適であり、そのまま使用してはならない。暗号で使用する擬似乱数については暗号論的擬似乱数の節および暗号論的擬似乱数生成器の記事を参照。
目次
用途
シミュレーション実験や、(暗号論的擬似乱数は)暗号などに利用されている。物理乱数よりも手軽に扱え、また、初期化に同じシード値を使用することで、まったく同じ乱数列を生成できるため、実験の再現ができるというメリットがある。逆に、再現性を利用して、シード値の選択を意図的(不正に)に行う可能性を排除することが必要な場合もある(楕円曲線暗号のパラメータ生成など)。
主な擬似乱数生成法
様々な擬似乱数生成法が知られている。
- 一般的生成法(方式と過去の出力が既知であれば、未来の出力を予測可能)
- 古典的生成法 - 平方採中法、線形合同法(乗算合同法・混合合同法)、線形帰還シフトレジスタ
- 新しい生成法 - メルセンヌ・ツイスタ、キャリー付き乗算、Xorshift、Lagged Fibonacci 法、カオス乱数
- 暗号学的に安全な生成法(方式と過去の出力が既知でも、未来の出力は予測不可能)
- BBS(Blum-Blum-Shub)、Fortuna
- (参考)擬似乱数ではない、真の乱数の生成法
- ハードウェア乱数生成器 - サイコロ、熱雑音、宇宙線などを利用する物理乱数
平方採中法 (middle-square method)
もっとも古い手法で、1946年頃、ノイマンが提案した。TAOCPの新しい訳本では二乗中抜き法と呼んでいる。
まず、適当に初期値を決める。以下、その(乱)数を 2 乗した値の中央にある必要な桁数を採って次の乱数とする。これを繰り返して乱数列とする方法。ここで「中央」とは、求まった値を必要な桁数の 2 倍の桁数として見た時の中央である。たとえば、4 桁を必要としていて、求まった値が 7 桁の時は、最上位の前の位(千万の位)に「0」を付け足して 8 桁とする(下の例を参照)。
(例)4 桁の擬似乱数を作ってみる。初期値を1763とする。
- 17632 = 03108169 → 1081
- 10812 = 01168561 → 1685
- 16852 = 02839225 → 8392
- 83922 = 70425664 → 4256
- 42562 = 18113536 → 1135
- …
こうして、擬似乱数列 {1763, 1081, 1685, 8392, 4256, 1135, …} を得る。
計算の結果、過去に現れた数と同じ数が現れればループとなり、その長さを周期と言うが、線形合同法を使えば周期が最長のものが理論的に可能であるため、現代において平方採中法が利用されることはまずない。
線形合同法 (linear congruential method)
テンプレート:Main 線形合同法の
- <math>X_{n+1}=\left(A\times X_n+B\right)\bmod M</math>
において、B=0 の場合を区別して特に乗算合同法、B>0 の場合を区別して特に混合合同法と言うことがある。
線形帰還シフトレジスタ
テンプレート:Main 擬似乱数の生成方式として、線形帰還シフトレジスタ (LFSR; Linear Feedback Shift Register) を用いた方法が知られている。LFSRはデジタル回路を用いて容易に実装することができる。特性多項式を適切に選択することによって、等頻度性、無相関性及び周期が保障される。乱数としては最長周期を保障するM系列を使う。
新しい擬似乱数生成アルゴリズム
上記のような古典的擬似乱数生成法の欠点を改良するため、新しい擬似乱数生成法がいくつか考案されている。
メルセンヌ・ツイスタ
カオス乱数
非線形微分方程式の解はカオスで、即ち初期値敏感性等の性質を持つ。これを漸化式として、カオス的な関数を得る。よく使われる関数にロジスティック関数やテント写像がある。
暗号論的擬似乱数
テンプレート:Main 一般の擬似乱数は、その方式と過去の出力が既知であれば、未来の出力を予測可能であるため、暗号の用途には不適(暗号学的に安全ではないと言う)である。
暗号理論では擬似乱数(生成器)に明確な定義がある。すなわち、多項式時間の計算機が乱数列と識別不能な列を出力する機器のことを、暗号論的擬似乱数生成器と呼び、この列に含まれる数を暗号論的擬似乱数という。 いかなる数列であれば乱数列であるか、議論のあるところではあるが、一様分布であることと過去の数から次の数が予測不能であることは同値であることが示されている(Yao)。そこで過去の数から次の数が予測不能であるかで、暗号論的擬似乱数か否かを区別する。
暗号理論では擬似乱数に厳密な定義が与えられている。Σ = {0,1}とする。自然数 k に対し、Σk 上の一様分布を Uk と表す。確率変数の族 {Xk}k∈N が、一様分布の族 {Uk}k∈N と計算量的識別不能な時、族 {Xk}k∈N は暗号論的擬似乱数であるという。
次に暗号論的擬似乱数生成器の厳密な定義をする。l(k) を l(k) > k を満たす多項式とする。G を多項式時間アルゴリズムで、G に k ビットのビット列を入力をすると l(k) ビットの出力を返すものとする。すると G(Uk) は Σl(k) 上の確率分布である。確率分布の族 {G(Uk)}k∈N が暗号論的擬似乱数である時、多項式時間アルゴリズム G を暗号論的擬似乱数生成機という。
一方向性関数が存在すれば暗号論的擬似乱数生成機が存在する事が知られている。
実際の生成法としては、一般の擬似乱数列を暗号学的ハッシュ関数に通す、という、簡単な構成法がある。