「コンピュータ(CPU)は確定的な決定性マシンであるため、単なる計算や数式だけでは真の乱数を絶対に作ることはできない」
これは、コンピュータ科学および数学における不変の真理である。
昭和〜平成初期の8ビット/16ビットマイコンや初期のゲーム機、古いC言語の `rand()` を知るエンジニアにとって、「乱数」とはROM上の乱数テーブルを参照するか、タイマー値やプログラムカウンタをシード(種)にして算術計算で導き出す「擬似乱数(PRNG)」であった。
シード値と計算式が解読されれば、次に何が出力されるか100%予測できる。それが計算機の宿命だったはずだ。
しかし現代のプロセッサは、この物理的限界をまったく別の角度から破り、「CPU自体が物理的な真の乱数を出力する」時代へと突入している。
現代のCPUは「物理現象」をチップ内に取り込んだ
「計算では乱数が作れないなら、物理現象を直接測ればいい」
現代のx86_64プロセッサ(Intelの `RDRAND` 命令など)やARMプロセッサには、CPUダイ(チップ内部)に電子の熱運動(熱ノイズ)や位相の微小なゆらぎを読み取るアナログ回路が直接埋め込まれている。
半導体内部で発生する熱ノイズや量子力学的ゆらぎは、完全に不規則で予測不能な自然現象だ。これをセンサーでデジタルビットに変換することで、数式やテーブルに頼らない「物理的真の乱数(TRNG)」をCPU単体で出力できるようになった。
だが、ここで1つの鋭い技術的疑問が浮かび上がる。
「熱ノイズを使っているなら、CPUの温度や地域の環境によって乱数に偏り(バイアス)が出ないのか?」
熱の偏りを打ち消す「フォン・ノイマンの脱バイアス」
結論から言えば、その疑念は100%正しい。
生の物理ノイズは、CPUが高温になったり環境が変わったりすると、電気的特性が変化して「1」が出やすくなったり「0」が出やすくなったりする絶対的な偏り(バイアス)が発生する。
では、現代のCPUはどうやってこの偏りを消し去り、完全均一な乱数に整形しているのか?
ここで使われているのが、コンピュータのジョン・フォン・ノイマンが考案した「脱バイアス(Von Neumann Unbiasing)」という数学的マジックである。
仮にCPUが熱くなり、1が出る確率が70%(0が30%)に偏ってしまったとしよう。この時、CPU内部のハードウェアは発生したビットを2個ずつのペアで評価する。
- `0` と `1` が出た場合 ➔ 「0」を出力(確率: $30\% \times 70\% = 21\%$)
- `1` と `0` が出た場合 ➔ 「1」を出力(確率: $70\% \times 30\% = 21\%$)
- `00` や `11`(同一ペア)が出た場合 ➔ 破棄して捨てる
どんなに「1」が出やすい温度環境であっても、$P(01)$ と $P(10)$ の発生確率は数学的に厳密に「1対1(全く同じ確率)」になる。
どんな過酷な温度変化があろうとも、この数理アルゴリズムを回路レベルで一瞬に通すことで、出力される結果は「50%対50%の完全平滑な乱数」へと強制的に修正されるのだ。
暗号ハードウェア・`RDSEED` 命令・自己診断(BIST)による多層防御
現代のCPUは、こうして抽出された綺麗な乱数ビット列を、さらに内部のAES暗号化ハードウェアエンジンに通して平滑化し、微小な統計的パターンすら完全に抹消する。
さらにIntel等のプロセッサには、2種類の異なる乱数命令が用意されている:
- `RDRAND`: 物理乱数を暗号エンジンで拡張し、アプリや暗号処理で使いやすい高速・高品質な乱数を出力する。
- `RDSEED`: 物理ノイズ源から得られた「純粋なシード(種)そのもの」を出力し、他の乱数生成器の種として注入するために使う。
また、万が一異常な酷暑や過酷な環境で物理回路が故障し、乱数性が低下した場合には、CPU内部の「BIST(組み込み自己診断)」が即座に異常を検知し、ソフトウェア側に「乱数生成失敗」のエラーフラグ(`CF=0`)を返す安全装置まで備わっている。
こうして作られたCPU乱数は、Linuxの `/dev/urandom` などのOSカーネル(エントロピープール)へも供給され、ハードウェアとソフトウェアが一体となって社会全体の暗号通信を保護している。
原理を知るエンジニアのロマン
「計算機は決定性である」という不変の基本原理を踏まえた上で、現代の半導体エンジニアたちは物理現象(熱ノイズ)と数学(フォン・ノイマンのアルゴリズム)、そして暗号回路とOSの連携を融合させ、完璧な乱数を生み出すシステムを完成させた。
古い時代の制約と原理を知るエンジニアだからこそ、このハードウェアと数学が織りなす洗練された進化の美しさに、深い感銘とロマンを覚えずにはいられない。
