10.4 乱数

人間が予測のつかない数を得たいならば、例えばサイコロを振れば良いであろう。 しかし、一時が万事決まっているコンピュータでこうしたランダムな数を得ようと するのは非常に難しい。一般に、このランダムな数を乱数というが、コンピュータ では乱数という場合2つの意味がある。一つは先に述べたサイコロを振って得られる ような数であり、もう一つは一連の数を出したときにまったく規則性のない数である。 このような乱数を如何に作るかという問題は現在でも関心をもたれている分野であり、 様々な応用分野を持っている。また、そうした学問的なものだけではなく、ゲーム を作る場合などにも非常に重要である。通常、コンピュータ上で乱数という場合、 先に述べた相互にまったく関連の無い不規則な一連の数を指している。例えば、 このような乱数を発生するプログラムを実行したときに、次のような一連の数が 得られたとしよう。

25, 38, 123, 84, 29, 1, 890, ...

確かにこれらの数には関連が無いように見える。しかし、2回目に同じプログラム を実行しても結果はまったく同じである。何回実行しても同じ結果しか得られない ならば、ゲームに使う事は出来ない。(あるステージでは、いつでも同じ所からしか 敵機があらわれないシューティングゲームなど興ざめである。)

しかし、もしこれらの一連の数の最初の項をずらしてしまえば、問題はなくなる。 従って、どれだけずらすかという事が重要なのだが、通常は年月日と時刻を使って 最初の項を決めることが多い。

 

C 言語の標準ライブラリには不十分であるが乱数を発生させる関数が用意されている。 乱数の初項を決めるために用いられる srand と具体的な乱数を得るために 使う rand がそれである。以下に引数と返り値を掲げておく。

    int  seed;
    int  srand(seed);     /* 関数 srand() の引数は整数、返り値も整数 */
    int  rand();          /* 関数 rand()  の引数はなし、返り値は整数 */

整数変数 seed に、先に述べたような日時から計算した整数を代入し、 srand を一度だけ呼び出せば、後は繰返し rand() を実行する事で 相互に無関係な乱数を得られる。

簡単な例

#include <stdio.h>
#include <stdlib.h>

main()
{
    int  i, seed, random;

    seed = 2;
    srand(seed);

    for (i=1; i<10; i++){
        random = rand();
        printf("random is %d\n", random);
    }
}

この例では、簡単のために seed には定数 2 を代入した。

注意 srand(),rand() 関数を使いたい場合には、プログラムの冒頭に #include <stdlib.h> を書かなければならない。



最初のページ 戻る 次へ 最後のページ 目次
Hiroyasu Asami