乱数と擬似乱数
Random Numbers and Pseudorandom Numbers ・ らんすうとぎじらんすう
偶然を計算機の上で再現する仕組み。シミュレーションと抽出の基盤
概要
乱数とは、次に何が出るか予測できない数の列のことです。サイコロを振って出た目を書き並べたものが典型で、どの値も等しい確率で現れ、過去の値から次の値を言い当てられない — この「予測不能性」と「偏りのなさ」が乱数の本質です。統計学では標本抽出の対象を偏りなく選ぶために、シミュレーションでは偶然そのものを実験材料にするために、乱数が欠かせません。
ところが計算機は決められた手順を正確に繰り返す機械であり、本物の偶然を生み出せません。そこで使われるのが擬似乱数です。決定的な計算式で「乱数にしか見えない」数列を次々に生成する仕組みで、出発点となる値(シード)が同じなら、まったく同じ列が再現されます。今日ソフトウェアで「乱数」と呼ばれるものの大半はこの擬似乱数です。
「偶然を機械で作る」という一見矛盾した営みは、統計・シミュレーション・ゲーム・暗号と、応用範囲がきわめて広い基盤技術になっています。どこまで本物らしければ十分か、再現できることは欠点か利点か — 用途によって答えが変わるのがこの語彙の面白いところです。
なぜ生まれたか
乱数がまとまった量で必要になったのは、20世紀前半の統計学からです。標本調査や実験計画で「無作為に選ぶ」ことの重要性が確立すると、人間の恣意を排して選ぶための道具が要りました。人間に適当に数を挙げさせると特定の数字を避けるなどの癖が出てしまうため、当初はルーレット式の機械などで生成した数を書物にまとめた「乱数表」が出版され、研究者はそれを引いて標本を選んでいました。1955年にランド研究所が出版した『百万個の乱数』はその集大成です。
決定打は電子計算機の登場です。1940年代、核反応のモンテカルロ法シミュレーションのために大量の乱数が必要になりましたが、乱数表を計算機に読み込むのは遅く、物理的な乱数発生装置は再現ができずデバッグを困難にしました。そこでフォン・ノイマンらは発想を転換し、「計算式で乱数らしい列を作ってしまう」擬似乱数を考案します。本人が「決定的な方法で乱数を作ろうとする者は罪深い状態にある」と冗談めかしたとおり原理的には偶然の偽物ですが、高速・省メモリで、しかも同じ列を再現できる — 科学計算にとってはむしろ本物より都合がよく、以後の標準になりました。
詳細
擬似乱数の仕組み — シードと内部状態
擬似乱数生成器(PRNG: Pseudorandom Number Generator)の骨格は単純で、「内部状態」と呼ばれる数値を持ち、決まった計算式で状態を更新しながら、状態から出力値を取り出すことの繰り返しです。最初の状態を決める値がシード(種)です。
初期の代表例は線形合同法で、「前の値に定数を掛けて足し、割った余りを取る」だけの式です。単純なぶん品質の問題(生成した点を多次元にプロットすると規則的な平面に乗ってしまう等)が知られ、現在の多くの言語ではより長い周期と良い統計的性質を持つメルセンヌ・ツイスタや PCG、xoshiro 系などが標準です。どの生成器も内部状態が有限なのでいつかは同じ列に戻る「周期」がありますが、現代の生成器の周期は事実上尽きない長さです。
一様乱数から任意の分布へ
生成器が直接吐くのは、ふつう区間0〜1に均等に散らばる一様乱数です。しかし実験で欲しいのは正規分布に従う乱数だったり、サイコロの目だったりします。ここで使うのが変換のテクニックで、目的の確率分布の累積分布関数の逆関数に一様乱数を通す「逆関数法」が基本形です。累積確率は必ず0〜1に収まるので、一様乱数を「累積確率の目盛り」とみなして逆引きすれば、任意の分布に従う値が得られます。正規乱数専用のボックス゠ミュラー法、複雑な分布に使う棄却法など変換法は豊富にあり、「一様乱数さえ良質なら、どんな分布の偶然でも作れる」ことが乱数ライブラリの設計原理になっています。
再現性 — 欠点ではなく機能
「シードが同じなら同じ列」という決定性は、偶然の偽物としては欠点ですが、道具としては第一級の機能です。シミュレーション研究では、論文にシードを明記すれば結果を誰でも追試できます。機械学習では、シードを固定して学習の再現性を確保し、条件の違いだけを比較します。ソフトウェアテストでは、乱数を使ったテストが失敗したとき、同じシードで再実行してバグを確実に再現できます。逆に言えば、シードを固定し忘れると「昨日と結果が違うが原因が分からない」事態を招く — 乱数を使う実務では、シード管理はログ設計と同じくらい基本的な作法です。
統計用と暗号用 — 混同してはいけない境界
擬似乱数には用途による決定的な区別があります。統計・シミュレーション用の生成器は、統計的な偏りのなさと速度を目的に設計されており、出力をしばらく観察すれば内部状態を逆算できるものが少なくありません(メルセンヌ・ツイスタは624個の出力から完全に予測可能です)。パスワードやトークンの生成にこれを使うと、攻撃者に「次の乱数」を当てられてしまいます。暗号用途には、予測不能性を保証するよう設計された暗号論的擬似乱数生成器(CSPRNG)や、熱雑音などの物理現象から偶然を取り出すハードウェア乱数源を使わなければなりません。「統計的にランダムに見える」ことと「敵に予測されない」ことは別の要件である — この境界の混同は実際に多くのセキュリティ事故を生んできた、この分野で最も重要な落とし穴です。
