Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

rand() / srand()

疑似乱数を生成する関数です。ゲームや数値シミュレーションなど、予測できない値が必要な場面で使います。同じシード値からは常に同じ乱数列が生成されます。

構文
// 0 以上 RAND_MAX 以下の疑似乱数を返します。
// RAND_MAX は処理系依存ですが、最低でも 32767 以上です。
int rand(void);

// 乱数生成器のシード(種)を設定します。
// 同じ seed を渡すと同じ乱数列が生成されます。
void srand(unsigned int seed);
よく使うパターン
目的コード例概要
シード初期化srand((unsigned)time(NULL))実行するたびに異なる乱数列を得るため、現在時刻をシードにします。
0〜N-1 の整数rand() % N剰余演算で範囲を絞ります。ただし偏りが生じる場合があります。
MIN〜MAX の整数MIN + rand() % (MAX - MIN + 1)オフセットを加えて範囲をずらします。
0.0〜1.0 の実数(double)rand() / RAND_MAXRAND_MAX で割って [0.0, 1.0] の浮動小数点数にします。
サンプルコード
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    // time(NULL) をシードにして実行ごとに異なる乱数列を生成します。
    srand((unsigned int)time(NULL));

    // 1〜6 のサイコロを5回振ります。
    printf("サイコロ: ");
    for (int i = 0; i < 5; i++) {
        int dice = 1 + rand() % 6;
        printf("%d ", dice);
    }
    printf("\n");

    // 0.0〜1.0 の乱数を3個生成します。
    printf("浮動小数点乱数: ");
    for (int i = 0; i < 3; i++) {
        double r = (double)rand() / RAND_MAX;
        printf("%.4f ", r);
    }
    printf("\n");

    // 同じシードを使うと毎回同じ列が生成されます(再現性の確認)。
    srand(42);
    printf("seed=42: ");
    for (int i = 0; i < 5; i++) {
        printf("%d ", rand() % 100);
    }
    printf("\n");

    return 0;
}
概要

『rand()』が返す値の品質(乱数の偏りや周期)は処理系に依存します。セキュリティ目的(パスワード生成・暗号処理など)には rand() を使わないでください。そのような用途には OS が提供するセキュアな乱数源(Unix系では /dev/urandom)を使ってください。

『rand() % N』は RAND_MAX が N の倍数でない場合、小さい値が若干多く出る偏りがあります。高品質な乱数が必要な場合は C11 の Annex K の代替関数や外部ライブラリを検討してください。

現在時刻の取得には『time()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。