RND関数、実は疑似乱数
- カテゴリ:パソコン/インターネット
- 2009/09/22 23:55:32
プログラミング言語の、乱数を発生させる関数は「RND」ですねぇ。
あ、言語によっては違う表記もあるか、まあいいや。
この関数の正体は、その設計により様々で、僕は知らないのだが、基本的知識として、RNDが真の乱数でないのは知っている。
ひどいのになると、昔のマイクロソフトBASICのランダムは、決められたリストを順に読み出すだけの、手抜きだった。
たとえば、
3 7 5 1 6 2 9 0 4 8
というリストを順に読み上げると、なんとなく、0から9までの範囲で発生する乱数のように見える。
これの桁数が多くて、リストが長ければ、簡易的に乱数のように使えるというわけだ。
RND関数は、これが、0<1 の範囲で、小数点以下何桁か忘れたけど、けっこうな桁数の少数で発生するというもの。
マイクロソフトBASICは、そのBASICが動作を始めて、RND関数が呼び出されるごとに、リストの先頭から順番に読み出すから、
たとえばサイコロを振るプログラムを作って、
パソコンの電源を入れたら、何もせずに、一番最初にそのプログラムを走らせると、
必ず同じ目が出る、
ということになる。
他のプログラムを走らせて、それがRND関数を使ったりすると、リストが先に進むので、再びサイコロプログラムを走らせた時には、どんな目が出るかわからない。
だから、一応、ランダムっぽく見えるわけだ。
このRND関数に、本当の乱数を与えれば、真の乱数として使えるようになる。
そこがプログラマーの腕の見せ所。
たとえば先ほどのサイコロプログラム、これに、僕なら時刻の関数を与える。
プログラムを起動すると、「サイコロを振る」というボタンが表示されて、クリックすると、サイコロが振られる、という手順だったとする。
すると、人間がクリックする瞬間というのは、偶然といって差し支えないだろう。
クリックした瞬間の時刻の関数から、「秒」を読み出す。
これを60で割れば、0<1 の乱数になる。
ただ、このプログラム内容を知っている人が操作すれば、自由にサイコロの目を出せる。
あくまでも、操作する人間が、時計を気にしないという条件のもとで成立する乱数だ。
そこで、この時計乱数と、RND関数をかける。
これでも真の乱数ではないのだが、狙った目を出すための条件が増える。
いちいち、((RND関数のリストを見て、時計を見て、狙った目を出す)という物好きな人間はいないだろう)という条件の下でなら、
まあまあ、事実上の乱数と呼べる。
乱数を発生させるというのは、けっこうな手間なのだ。
—————
ニココレは、ランダムで10人選出してステージに出すことになっている。
ガチャも、乱数に、目玉商品の重み付けを持たせたもののはずだ。
でも、どうもニコッとの乱数は評判が悪い。
そんなことで、この記事を書いてみた。