2013年10月31日木曜日

"random" に関する理解

Processingでグラフィックを描きはじめてすぐに気がついたのですが,random()を呼ぶと毎回違う値を出力してきます.
他の言語ではいわゆる乱数シードをいじってやらないと毎回同じ値が出てくるのとは対照的です.

これ,グラフィックやアートを強く意識した言語であるProcessingのインタラクティブ志向っぷりがシンプルに垣間見えるポイントの一つであるような気がします.


もう10年ぐらい前になってしまうんですが,高専時代の話.
高専って,大学のように最終学年で研究室に入って卒業研究をやるんですが,自分がやらせてもらったテーマはニューラルネットワークの数理的解析みたいなものでした.

最初に先生から以下のような指示を受けました.

「この関数1と関数2にそれぞれループで乱数を与えて,出力を並べてグラフにしてみて.」



私はそれに応えるべく,C言語で乱数を発生させるコードを書きました.
『ちゃんとランダムになるように,実行のたびに違う値が出るようにしないと^^』

srand(time(null));


――「時刻をシードにしてrandomを初期化する」というのは,趣味でプログラミングをしている人からするとほぼ常識のような基本技だと思います.こうすることで,少なくとも(実用的な範囲内で)2度と同じ数列は出ないだろうと.

計算結果を先生に報告したら,
「いやいや,毎回違う値が出てきたら困るから.再現性ないでしょ」
といった調子で定数をシードにするように修正されましたw

ニューラルネットで使われるパーセプトロンというモデルには「多次元しきい値関数」みたいな性質があって,乱数の偏りとか分布とかを容易に観測できます.それを体験させるのが先生の意図だったと思うのですが,勝手にいらんことしてしまいましたねw
ともあれ,乱数というものについて考えを改めさせられた最初の出来事でした.

乱数とは「ある確率分布に従って出てくる数列」のことを言うのであって,実行するたびに同じかどうかは別の問題です.
ランダムと聞くとみんな反射的に時刻でリセットしたがるのは,「得られた数列を試行回数で並べて評価する」という前提があるからです.試行ごとに再現性を持たせたくないという立場で言えば,毎回同じ値が出てきちゃうと,数と数との間の関係が確率的に決まっても,数列と数列の間の関係は一意に決まってしまうんですよね…
n個の数をn次元空間の座標としてプロットすると,そりゃ毎回おんなじ1つの点です.

ProcessingもrandomSeed()という関数でシードを指定してリセットできるので,実行のたびに同じ乱数を出したり,再現性を持たせることはもちろん可能です.

しかし,「シードを明示的に設定しない時は再現性のない乱数が発生する」というのは,
Processingにおいて,random()に何が期待されているか,どういう使われ方を想定しているか
といった事について,開発者の認識というかコンセプト的なものが見え隠れしてませんかね.

数列自体にも,わざと偏りを持たせてみたりすると,ただの適当な数ではなくてアート的な意味付けができてくる気がします.






0 件のコメント :

コメントを投稿