ゾンビでもわかるC言語プログラミング

C言語入門者の応援をします

rand関数でランダムな値を生成する

Index

1. はじめに

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

2. 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 内で定義されています。

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

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

3. 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

出力が変わりました。
これをコードを変えずに実行する度に乱数の値を変えるには、どうすれば良いでしょうか。

実行するタイミングによって変わるもの(時間)をシードに指定すれば良いのです。

4. 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;
}

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

5. 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

書籍

新・明解C言語 入門編 (明解シリーズ)

新・明解C言語 入門編 (明解シリーズ)

苦しんで覚えるC言語

苦しんで覚えるC言語

やさしいC 第5版 (「やさしい」シリーズ)

やさしいC 第5版 (「やさしい」シリーズ)

C実践プログラミング 第3版

C実践プログラミング 第3版