RAND(3)

名前
rand, srand - 乱数を生成する関数

書式
#include <stdlib.h>

int rand(void);

void srand(unsigned int seed);

説明
rand() 関数は0から RAND_MAX の間の疑似乱数整数を返す。

srand()関数は、 rand()関数で作られる疑似乱数整数系列の新しい種として、 その引数の値を使用する。 これらの関数を使用して作られた疑似乱数系列は、 同じ値を引数に使用してsrand()を呼ぶことによって、 再現することが可能である。

種の値が与えられない場合には、rand()関数は 自動的に1を種とする。

返り値
rand()関数は 0 と RAND_MAX の間の数を返す。 srand()関数はどのような値も返さない。

注意
rand()とsrand()の Linux C Library 版は random()とsrandom() のふたつの関数と同じ乱数生成の アルゴリズムを使用している。そのため、下位のビットは上位のビットと 同じくらいにランダムである。 しかし旧版の rand() の実装は、下位のビットが高次のビットほどランダムになってはいない。

Numerical Recipes in C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New York: Cambridge University Press, 1990 (1st ed, p. 207)) では、次のようなコメントがなされている。
    「1 と 10 の間の乱数を生成したいのであれば、常に

        j=1+(int) (10.0*rand()/(RAND_MAX+1.0));

    を用いて行いなさい。そして、

        j=1+((int) (1000000.0*rand()) % 10);

    のような、すべての方法を止めなさい (これは下位のビットを使用している)。」

乱数の生成は複雑な話題である。前述の Numerical Recipes in C でも実用的な乱数生成を論点とした優れた議論を第７章(乱数)で展開している。

より理論的な議論については Donald E. Knuth の The Art of Computer Programming, volume 2 (Seminumerical Algorithms), 2nd ed.; Reading, Massachusetts: Addison-Wesley Publishing Company, 1981 の第３章(乱数)を見よ。これは、 たくさんの実用的な話題についても深く網羅している。

準拠
SVID 3, BSD 4.3, ISO 9899

関連項目
random(3), srandom(3), initstate(3), setstate(3)