観察 / observation

水滴は、
毎回ちがう
散り方をする。

同じ高さ。同じ大きさ。同じ場所。
なのに、飛沫のかたちは一度として繰り返さない。

なぜ? ——そして、この「予測できなさ」から、乱数は作れるのだろうか。
これは、その問いを動くコードまで連れていった記録です。

スクロールして確かめる
章 01 / なぜ毎回ちがうのか

原因は、カオス的な鋭敏性。

落ちる液滴は表面張力でかすかに振動している。着地の瞬間にどの位相だったか、縁のどこが一番薄かったか——ナノメートル単位のちがいが、レイリー・プラトー不安定性で引き伸ばされ、飛沫の数と向きを決める。

「同じ条件」は、拡大すれば決して同じではない。その微差が指数関数的に増幅される。これがカオス——決定論的なのに予測できない、という現象です。

ほぼ同一の初期値でも、軌道はやがて完全に分かれる
章 02 / 物理をコードに移す

散らばりを、格子の上で再現する。

水滴そのものを流体計算するのは重い。かわりに、散らばりの構造だけを写し取る。一列に並んだセルがそれぞれカオス的に進み(液滴の振動)、隣と結合して波及する(飛沫の広がり)。これは結合写像格子(CML)——カオス乱数の研究で実績のある構造です。

下が、いま実際に走っているエンジンの状態。明るいほど高い値。一点の乱れが横へ伝わっていくのが見えます。

章 03 / 発見

カオスだけでは、乱数にならない。

ここが一番面白いところ。カオスの生の出力をそのまま乱数として使うと——統計検定に落ちる。アトラクタには密度のムラがあり、ビットの均衡が崩れ、値が偏る。「予測できない」と「ランダムに見える」は別物だった。

下の2つは、同じエンジンの出力を点群で描いたもの。左は生(raw)、右は撹拌(whitening)を一段かけたもの。生のほうには、目に見える筋・粗密がある。

raw — カオス生出力 偏りあり
whitened — 撹拌後 平坦
バイト値の分布(256階級)
いま表示中: whitened
章 04 / 撹拌(whitening)とは

偏りを、まっ平らに整える。

whitening は、偏ったビット列を一様に見えるよう均す処理。名前は白色雑音(全周波数が均等なノイズ)から来ている。ここでは外部依存なしの整数アバランチ撹拌(SplitMix64系)を一段。入力のどのビットを変えても出力の約半分が反転する——だから偏りが残らない。

下のビットを一つクリックして反転させると、撹拌後の出力がどれだけ激変するか見えます(アバランチ効果)。

入力 64bit(クリックで反転)
撹拌後の出力
章 05 / 正直な評価

で、これは「良い乱数」なのか?

作ったうえで、はっきり言う価値がある。実用乱数としては、既存に勝てない。

乱数の品質・速度で見ると ✗ 品質最終的な品質は撹拌段が決めている。カオス部分は品質に寄与していない。PCG・ChaChaは理論保証も厚い。 ✗ 速度純Python実装で標準の100倍遅い。流体的な状態遷移を毎回回すのだから当然。 ✗ 物理エントロピーシミュレーションは決定論的。「本物の物理乱数」の看板は使えない(Lavarand とはそこが違う)。 では、何に価値があるか ○ 軌跡水滴を見た疑問を、物理の理解→実装→検証→そして「優れてはいない」と見抜くところまで連れていった、その筋道。 ○ 教材「カオス≠ランダム」「撹拌の効果」を、動かして・検定で確かめられる形にした。 ○ パターン同じCMLエンジンは、乱数器としては凡庸でも、空間的に相関した"自然な散らばり"の生成器としては個性を持つ。

最初の問いに戻ると——水滴の散らばりは確かに乱数になる。ただし、その乱数を「良く」しているのは水滴ではなかった。それを知れたことが、この小さな探究の答えです。

engine: Coupled Map Lattice (logistic r=4, ring coupling) → SplitMix64 mixer · 検証: PractRand 64MB / NIST monobit·runs·χ² すべて通過(whitened) · 実装言語: Python / このページ内のJSは同一ロジックの移植版で、すべてその場で計算しています。