Nicotto Town


およよ・れおポン


RND関数、実は疑似乱数

プログラミング言語の、乱数を発生させる関数は「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人選出してステージに出すことになっている。

ガチャも、乱数に、目玉商品の重み付けを持たせたもののはずだ。

でも、どうもニコッとの乱数は評判が悪い。

そんなことで、この記事を書いてみた。

#日記広場:パソコン/インターネット





Copyright © 2025 SMILE-LAB Co., Ltd. All Rights Reserved.