置いてけぼり日記

はてなRSSに追加Add to GoogleMy Yahoo!に追加RSS Feed
完全にランダムなシャッフル再生は可能か(上)
はっはっは。
ある程度技術を習得したプログラマならこの内容を面白く読めると思うんだけども、この文章での笑い所ってちょっと説明が難しかったりする。

Cでいうと、

// MusicCount = 曲合計
// PlayNo = 演奏する局番号
PlayNo = rand() * MusicCount / RAND_MAX;

──という部分の話である。

「PlayNo = rand() * MusicCount / RAND_MAX;」というたった一文だけのために、上下篇でもってあれこれ語られるものなのだけど、この文法における「rand()関数」のプログラム原理をあらかじめ知る必要があるからだ。
これは、「ランダムはランダムじゃない(でたらめはでたらめじゃない)」という、鋼の錬金術師でいうと「ありえないはありえない」というセリフに匹敵する、プログラムにおける原理みたいなものである。
ぶっちゃけた話、コンピュータにおける基本的なランダム数値とは、6,8,2,9,3,5,7,0,4,1,6,8,2,9,3,5,7,0,4,1,6,8,2,9,3,5,7,0,4,1,6,8,2,9,3,5,7,0,4,1,,.... と、ある計算式でもって順番に出力される循環数値なのだ。
もちろん、これを破る方法はある。
コンピュータに最初の数値(上記でいうと、最初の「6」)を選ばせなければいいのだ。
そんな方法はあるのか?
これがあるのだ。それは「人間というキチガイの介入」である。
なんのこっちゃいって思った?
具体的にはこういうことである。
「人間がプログラムの実行を行った時間(秒でも、ミリ秒でも何でもいい)を、最初の数値とする」
Cでいうsrand()、VBでいうとRandomizeである。
これで少なくとも毎回起動するごとにまったく異なるランダム値が出てくるようになるのだ。
しかし、これでもまだランダムには成りきれていない。なぜなら、単に最初の数を設定しただけで、出現する数の順序は変わっていないのだから。

だったら、ことあるごとに時間を計測するか?
いや、そうもいかないだろう。
コンピュータの処理は、それがある一定時間で処理できるという行儀の良いものほど、時間計測というものが仇になるのだ。下手したら、1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,....と計測した時間を辿るだけのものになってしまうのだから。たとえピコ秒単位で計測ができたとしても、飛び飛びに値を拾うだけである。
アクションゲームのように常に人間の入力が期待できるものであるなら、その都度マイクロ秒単位で計測するだけでも、結構面白いランダム値が引っ張り出せるかもしれないけどね。

解説おしまい。

検索キーワードTOP20