←↑→ 乱数について
おみくじとかタロットとか易とかのプログラムを作る時に、重要な役割を果
たすのは「乱数」です。

多くのこの手のソフトが乱数の技法で作成されています(乱数を使わない方
法もある。後述)

乱数にもいろいろな種類があるのですが、この場合欲しいのは「一様乱数」
といい、次に出る数が何になるかの確率が全て等しいものです。

例えば「ランダムに数を言って下さい」と言われて、3を3回続けて言う人
はほとんどいないと思いますが、ほんとうにランダムであれば、3が3回続
くことだって当然あります。

コンピュータで乱数を作る場合は、疑似乱数という手法で作ります。一般に
は掛け算と足し算の組み合わせでひとつの数から順次次の数を作っていく手
法(混合合同式法 next = (now × a + b) mod c)を使います。普通は多く
の処理系で、rand() とか rnd() などといった名前で提供されています。

しかし疑似乱数を発生させるにはその「元」が必要です。「種」といっても
いいです。要するに計算を始める最初の値であり、これが等しければ乱数は
いつも同じ数を発生させます。

そこで、よく使われる手法は、現在の時刻を取得して、それをもとに種を作
る方法です。この場合、おみくじを引く度に違う結果が得られます。

それを避けたい時、たとえば「その日の運勢」を出したいような場合は、時
刻までは使わずに日付だけで行き、数字が足りない場合はIPアドレスなど
を使用する手があります。このあたりのやり方はいろいろな流儀があります。

Javaなどで作る場合は、入力待ちの間にもプログラムを動作させ続けること
ができます。その場合「待ちながら乱数を引き続ける」という手法がとても
有効です。そしてこの方法は、経験上、ひじょうに的中率の高いおみくじに
なりやすいのです。(この手法は変靴氏からご教示頂きました。感謝)

JavaScriptやPerlなどで作る場合は、こういう手法は困難ですので諦めざる
を得ません。秒数の数字から生成した回数分、乱数を取る方法か、画面の
表示時刻を短期Cookieか何かに記録しておき、実際にボタンを押された時刻
を見て経過秒数分乱数を引く、などといったところが限界でしょう。

なお、まれに提供されているrand()が使いモノにならない場合もあります。
テストしてみて同じものばかり出る場合は、自分で上記の計算式で乱数を発
生させた方がよいでしょう。その場合品質のいい乱数を出す a,b,c の組を
見つけるまでに少し苦労するかも知れません。

下記の団子占いなどはこの乱数の手法で作っています。JavaScriptですので
ソースは見れますから、自由に流用してくださって構いません。

  http://www.nifty.ne.jp/forum/ffortune/oracle/dango.htm

(そのまま使うのはやめてね ^^;; それから画像は自作ではなく素材集のデ
ータなので転載は許可できません。各自素材集からGetするか描いて下さい)


←↑→
(C)copyright ffortune.net 1995-2007 produced by ffortune and Lumi.
お問い合わせはこちらから