Chaos

ランダムな数

数値実験を行う場合,ランダムな数字を使うことが多々あります.例えば,ニューラルネットに与えるcueパターンを自動的にたくさん作るときなどがそうです.このとき,例えばC言語なら,rand()という関数が用意されています.この関数から出てくる数値を見ていると,なぜか不思議な気分になります.これらは本当にランダムなのでしょうか.

また,友人に0から9までの中から次々とランダムに数を挙げていくようにお願いすると面白いことが分かります.なぜだか,規則性のある数の列になっていたりします.



ロジスティック写像

それでは,rand()関数を使わずに計算機上でランダムな数を作るにはどうしたらようでしょうか.完全なランダムは実は難しいのです.そこで,ここでは次のような有名な関数を考えます.

X_n+1=a*X_n*(1-X_n)



アメリカの数理生物学者ロバート・メイ(1976)が考えた,ロジスティック関数と呼ばれる差分方程式です.生物の個体の数が,親から子,子から孫へ世代を重ねていくことでどう変化するかについてのモデルだそうです(a:繁殖率,X:個体の数).詳しくは,グーグルなどで検索してみてください.

とにかく,どういった挙動をするのか見てみます.例えば,(a, x_1)=(4.0, 0.10)の場合は,下図の赤線のように数が変動します.しかも,値はぐちゃぐちゃでランダムのようにみえます.


図:ロジスティック関数の挙動

また,Xの初期値を少しだけ変えて,(a, x_1)=(4.0, 0.11),(a, x_1)=(4.0, 0.12)としたものが緑線と青線です.初期値が少し変わるだけで挙動は全く異なることが分かります.ちなみに,aを変化させるとある値に収束したり,発散したりします.



ランダム数列の作成

このロジスティック写像を用いてランダムの数列を作ります.例えば,上述の赤線の例から,Xの小数第一位の数をとり出して数を並べてみると[1, 3, 9, 2, 8, 5, 9, 1, 4, 9, 1, 5, ...]となっています.

適切なパラメータを設定することで,異なる時間(ここでは,異なる世代nのこと)を取りだすと全く違う数列が出来ています(下の二つの図).人間が見る限りランダムに見えます.これらの数値を利用して,0から9までの数を疑似ランダムに生成してみます(実際は少し手を加えました).


図:初期の数列


図:少し時間が経過した時の数列

53,002回くらい繰り返した後,0から9の出現数を見てみると次のようになります.

0 :5254
1 :5228
2 :5204
3 :5260
4 :5322
5 :5271
6 :5279
7 :5396
8 :5422
9 :5366



本当にランダムか?

この関数から作られた数列がそのままランダムというわけではありません(カオスはランダムという意味ではない).この疑似ランダムは,もしかしたら,周期性があるかもしれません.

例えば,さっき作ったランダムっぽい数に基づいてある領域内にたくさんのランダムな線を引いてみます(下の図).何か規則性があれば,描かれる図に偏りが出てくると思います.結果は,まんべんなく領域全体に線が引かれているようにみえます.


図:ランダムに引いた線分


同様に,ランダムにたくさんの正方形を配置してみます.それなりに,でたらめに正方形が配置されているようにみえます.まあ,簡単な数値実験ならこのくらいのランダム具合で十分かもしれません.それなりに良い実験結果が出ても,初期値を変えて確認をしたくなる気持は少しは抑えられます.


図:ランダムに配置した正方形



ランダムウォーク

さっき作ったランダムな数を基に,中心からフラフラと動きまわるエージェントを作ってみました.初めは画面の中央にエージェントはいます.そして,ほぼ等確率で8方向へ移動します.

真ん中(初期位置)の辺りに留まっているのかと思ったら,意外にもあちこち動いたりします.


図:初期に歩いた軌道


図:長い時間歩いた軌道

お酒は控えめに.