BohYoh.comトップページへ
C & C++ FAQ
目次

C C++ プログラムを起動するたびに異なる乱数を発生させるにはどうすればよいですか。

 擬似乱数を生成するrand関数は“種”を利用して計算を行って、乱数を発生させます。“種”の値は、rand関数に埋め込まれているため、

#include <stdlib.h> int x; /* ... */ x = rand(); /* 0以上RAND_MAX以下の乱数を発生 */

というプログラムを実行すると、xに代入されるのは、いつも同じ値となります。
 種の値を変更するのが、srand関数です。たとえば、

srand(50); /* 種を50に設定 */

といった具合に種の値を変更できます。もっとも、このように定数を渡してsrand関数を呼び出しても、その後にrand関数が発生する値は同一のものとなります。srand関数に与える引数は、乱数でなければなりません(??)。乱数を発生させるために、乱数が必要であるというのも、おかしな話です。
 そこで、よく使われる手法の一つが、srand関数に対して、現在の時刻を与える方法です。プログラム例を以下に示します。

#include <time.h> #include <stdlib.h> int x; /* ... */ srand(time(NULL)); /* 現在の時刻から種を決定 */ x = rand(); /* 0以上RAND_MAX以下の乱数を発生 */

 time関数が返却するのはtime_t型です。この型は処理系に依存しますが、long型やdouble型などの算術型の同義語として定義されます。

■ 根拠 ■
標準C §7.10.2 Pseudo-random sequence generation functions
標準C99 §7.20.2 Pseudo-random sequence generation functions
標準C++ §20.6.5 C Library

■ 参照 ■
FAQ 乱数を発生させるにはどうすればよいですか。
関数 rand関数
関数 srand関数

戻る

BohYoh.comロゴ