水滴は、
毎回ちがう
散り方をする。
同じ高さ。同じ大きさ。同じ場所。
なのに、飛沫のかたちは一度として繰り返さない。
なぜ? ——そして、この「予測できなさ」から、乱数は作れるのだろうか。
これは、その問いを動くコードまで連れていった記録です。
原因は、カオス的な鋭敏性。
落ちる液滴は表面張力でかすかに振動している。着地の瞬間にどの位相だったか、縁のどこが一番薄かったか——ナノメートル単位のちがいが、レイリー・プラトー不安定性で引き伸ばされ、飛沫の数と向きを決める。
「同じ条件」は、拡大すれば決して同じではない。その微差が指数関数的に増幅される。これがカオス——決定論的なのに予測できない、という現象です。
散らばりを、格子の上で再現する。
水滴そのものを流体計算するのは重い。かわりに、散らばりの構造だけを写し取る。一列に並んだセルがそれぞれカオス的に進み(液滴の振動)、隣と結合して波及する(飛沫の広がり)。これは結合写像格子(CML)——カオス乱数の研究で実績のある構造です。
下が、いま実際に走っているエンジンの状態。明るいほど高い値。一点の乱れが横へ伝わっていくのが見えます。
カオスだけでは、乱数にならない。
ここが一番面白いところ。カオスの生の出力をそのまま乱数として使うと——統計検定に落ちる。アトラクタには密度のムラがあり、ビットの均衡が崩れ、値が偏る。「予測できない」と「ランダムに見える」は別物だった。
下の2つは、同じエンジンの出力を点群で描いたもの。左は生(raw)、右は撹拌(whitening)を一段かけたもの。生のほうには、目に見える筋・粗密がある。
偏りを、まっ平らに整える。
whitening は、偏ったビット列を一様に見えるよう均す処理。名前は白色雑音(全周波数が均等なノイズ)から来ている。ここでは外部依存なしの整数アバランチ撹拌(SplitMix64系)を一段。入力のどのビットを変えても出力の約半分が反転する——だから偏りが残らない。
下のビットを一つクリックして反転させると、撹拌後の出力がどれだけ激変するか見えます(アバランチ効果)。
で、これは「良い乱数」なのか?
作ったうえで、はっきり言う価値がある。実用乱数としては、既存に勝てない。
最初の問いに戻ると——水滴の散らばりは確かに乱数になる。ただし、その乱数を「良く」しているのは水滴ではなかった。それを知れたことが、この小さな探究の答えです。