はじめに

C言語では、rand関数を使用することで擬似乱数を生成することができる。
擬似乱数はコンピュータで擬似的に生成する乱数で、完全に偏りがないランダムな値にはならない。
コンピュータ上で完全にランダムな値を生成するのはとても困難なので、通常は代わりに擬似乱数を使用する。

rand関数を使用してみる

rand関数を使用するには、stdlib.hをインクルードする。

以下のコードを実行してみる。

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

int main() {
    int i, r;

    for(i=0; i<10; i++) {
        r = rand(); // 乱数を生成する
        printf("%d\n", r);
    }

    return 0;
}

出力は以下の様になる(値はそれぞれの環境で変わる)。

16807
282475249
1622650073
984943658
1144108930
470211272
101027544
1457850878
1458777923
2007237709

rand関数は、0 ~ RAND_MAX の間の擬似乱数を返す。
RNAD_MAX は、stdlib.h 内で定義されている。

もう一度プログラムを実行してみる。
すると、出力は先ほどと同じになる。

擬似乱数は何か元の値から生成され、先ほどは元の値が同一であったため出力が同じになる。
また、元の値をシード(種)と言う。

srand関数を使用してみる

C言語でシードを指定するには、srand関数を使用する。
srand関数は、何度も使用する必要はなく、通常はプログラムで一度だけ使用すれば良い。

srand(シード);
#include <stdio.h>
#include <stdlib.h>

int main() {
    int i, r;

    srand(1); // 1 をシードに指定

    for(i=0; i<10; i++) {
        r = rand();
        printf("%d\n", r);
    }

    return 0;
}

シードに 1 を指定した場合の出力。

16807
282475249
1622650073
984943658
1144108930
470211272
101027544
1457850878
1458777923
2007237709

また、シードを 2 に変えてみる。

srand(2);

出力

33614
564950498
1097816499
1969887316
140734213
940422544
202055088
768218109
770072199
1866991771

出力が変わった。
これをコードを変えずに実行する度に乱数の値を変えるには、実行するタイミングによって変わるもの(時間)をシードに指定すれば良い。

time関数で時間をシードに設定する

時間を取得するには、time関数を使用する。

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

int main() {
    int i, r;
    unsigned int t;

    t = time(NULL);
    srand(t);

    for(i=0; i<10; i++) {
        r = rand();
        printf("%d\n", r);
    }

    return 0;
}

こうすることで、実行ごとに違う値が出力される。
ただし時間は一秒ごとに変わるので、一秒以内に複数実行しても時間が変わらずシードが同じになり、出力される値は変わらない。

1~10の範囲で結果を出力する。

time関数は、0 ~ RAND_MAX の範囲を出力する。
例えば 1 ~ 10 の値を出力したい場合は、10で割った余りに1を足せば求めることができる。

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

int main() {
    int i, r;
    unsigned int t;

    t = time(NULL);
    srand(t);

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

    return 0;
}

出力例

10
2
3
7
10
4
1
9
7
6

0件のコメント

コメントを残す

アバタープレースホルダー

メールアドレスが公開されることはありません。 が付いている欄は必須項目です