乱数の使い方

教科書での乱数の利用法は、乱数を求める関数として、古い規格の「rand()」 という関数を用いていますが、互換性のためにあえて残してある関数で現在と なっては性能が良くない(乱雑さに偏りがある)ため、今ではより新しい 「random()」という関数を用いる方がよいです。ここでは、新しい「random()」 関数の使い方と、「乱数の種」を人間が入力しなくてもすむ方法について示し ます。(教科書では「乱数の種」を人間がいちいち入力していました。p. 28)

random()関数

「random()」関数は、0から(2**31)-1=2,147,483,647 までの範囲で、long型 の正数の連続した疑似乱数を与える関数です。一方教科書にある「rand()」関 数は、0から(2**16)-1=65,535までのint型の正数乱数を与える関数です。整数 の桁数が大きいこと、乱雑さの偏りがより小さいことから、最近では「rand()」 よりも「random()」関数を用いる方が良いでしょう。「rand()」は古いプログ ラムを変更せずにコンパイルするためだけに残されていると考えた方がよいと 思います。

「random()」関数は、「stdlib.h」ライブラリに収録されているので、まず 「stdlib.h」をインクルードします。プログラム冒頭で、

#include <stdlib.h>
とします。その後、乱数の種を用いて乱数の初期化を行った後、「random()」関 数を用います。教科書p. 28の<例2-2.1>を書き直すと次の様になります。

void main(void)
{
    long i, rn, seed; /* int -> long になっていることに注意 */

    printf("乱数の種を入力してください==>");
    scanf("%d",&seed);
    srandom(seed); /* srand(seed)がsrandom(seed)になっていることに注意*/

    for(i=0; i<50; i++){
        rn=random();
        printf("%11d\n",rn); /*表示桁数を増やしていることに注意 */
    }
}

「乱数の種」をいちいち手で入力せずに済ます方法

「乱数の種」とは乱数の列を計算するときにその計算の元となる数字で、これ が同じであれば計算される乱数の列は同じになります。ためしに<例2-2.1>の プログラムを2回実行し、両方で同じ「乱数の種」を入力してみてください。 同じ結果が得られるはずです。従って、本当にランダムにするためには、人間 が適当にランダムな数字を毎回入力しなくてはなりません。

コンピュータにランダムな数字を計算させるために人間がランダムな数字を入 力しなくてはならないというのは本末転倒なので、「乱数の種」をプログラム が適当に調達する方法を示します。

srandom(time(0));

としてみてください。今度は「乱数の種」を入力しなくても毎回異なる乱数が 計算されているはずです。

実数乱数および指定範囲の整数乱数の生成

実数乱数を計算したいとき(範囲: 0から1)、

x=random()/2147483647.0;

乱数の範囲を指定した整数乱数を発生したいとき、例えば0から99までなら

i=random()%100;
とすればよい。