ホームC言語Tips集数学 ≫ 擬似乱数を発生させる

C言語Tips集 - 擬似乱数を発生させる

C言語で擬似乱数を発生させるには,stdlib.hrand 関数を使用します.

rand

#include <stdlib.h>
int rand(void);

rand 関数は,0 以上 RAND_MAX 以下の範囲の擬似乱数を計算する関数です.なお,RAND_MAX マクロの値は処理系によって異なりますが,32767 以上であることが保障されています.

取得する擬似乱数の範囲を制限するためには rand 関数から返された値の余剰を計算します.

例えば 0 〜 50 までの擬似乱数を取得したい場合は以下のように記述します.

int r = rand() % 51;

1 〜 50 までの擬似乱数を取得したい場合は以下のように記述します.

int r = rand() % 50 + 1;

rand 関数はそのまま実行すると実行するたびに同じパターンで擬似乱数を発生します.
実行するたびに異なるパターンで擬似乱数を発生させるには,srand 関数を使用します.

srand

#include <stdlib.h>
void srand(
    unsigned int seed
);

srand 関数は,rand 関数で返される擬似乱数の乱数種 (シード) を seed に変更する関数です.シードとは,擬似乱数を生成するための計算に用いられる係数です.srand 関数でシードを設定することで擬似乱数生成のパターンを変更することができます.

実行毎に異なるパターンで擬似乱数を発生させるには,time 関数を使用して現在時刻を取得し,それを引数にして srand 関数を使用します.具体的には以下のように記述します.

#include <stdlib.h>
#include <time.h> /* time 関数のために必要 */

・・・

srand((unsigned)time(NULL));
r = rand();

C言語サンプルプログラム

以下に rand 関数と srand 関数を使用して,1 から 100 までの擬似乱数を生成するサンプルプログラムを示します.

/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* main */
int main(void) {
    int i, n;

    /* 乱数のシードを与える */
    srand((unsigned)time(NULL));

    for ( i = 0; i <= 9; i++ ) {
        /* 1 から 100 までの乱数を発生させる */
        n = rand() % 100 + 1;

        /* 表示 */
        printf("%2d回目 = %3d\n", i + 1, n);
    }
    return EXIT_SUCCESS;
}

実行例

サンプルプログラムの実行結果は以下のようになります.

 1回目 =  76
 2回目 =  31
 3回目 =  99
 4回目 =  12
 5回目 =  72
 6回目 =  48
 7回目 =  92
 8回目 =  27
 9回目 =  84
10回目 =  77

Cプログラマの必読書

たくさんあるC言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.

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

C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります. オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.


C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.

その他・未分類