Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

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

書式

       #include <stdlib.h>

       int rand(void);

       int rand_r(unsigned int *seedp);

       void srand(unsigned int seed);

   glibc 向けの機能検査マクロの要件 (feature_test_macros(7)  参照):

       rand_r():
           glibc 2.24 以降:
               _POSIX_C_SOURCE >= 199506L
           glibc 2.23 以前
               _POSIX_C_SOURCE

説明

       rand() 関数は 0 以上 RAND_MAX 以下 (数学的に書くと [0, RAND_MAX]) の範囲の疑似乱数整数を返
       す。

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

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

       rand() 関数は再入可能 (reentrant) ではない。この関数には隠し状態があり、呼び出される度にこ
       の隠し状態が変更されるからである。ちょうどこの隠し状態が次の呼び出し時の乱数の種として使わ
       れるようなものである。実際にはもう少し複雑かもしれないが。スレッドを使用するアプリケーショ
       ンで再現可能な動作をさせたい場合には、この状態を明示的に指定できなければならない。これを行
       うには、再入可能な rand_r() 関数を使用する。

       rand()  と同様、  rand_r()  は  [0, RAND_MAX]  の範囲の疑似乱数整数を返す。   seedp   引数
       は、rand_r()  の呼び出し間で状態を保持するために使用される unsigned int へのポインターであ
       る。 seedp が指す整数に同じ初期値を rand_r() を呼び出し、 呼び出し間でその値が変更されなけ
       れば、同じ疑似乱数系列が得られる。

       rand_r()  の seedp 引数が指す値により提供される状態は非常に小さな空間 なので、この関数は弱
       い疑似乱数生成器になってしまう。 代わりに drand48_r(3) を使ってみるとよい。

返り値

       関数 rand() と rand_r() は 0 以上 RAND_MAX 以下の数を返す。 関数 srand() は値を返さない。

属性

       この節で使用されている用語の説明については、 attributes(7) を参照。

       ┌──────────────────────────┬───────────────┬─────────┐
       │インターフェース属性      │
       ├──────────────────────────┼───────────────┼─────────┤
       │rand(), rand_r(), srand() │ Thread safety │ MT-Safe │
       └──────────────────────────┴───────────────┴─────────┘

準拠

       関数 rand()  と srand()  は SVr4, 4.3BSD, C89,  C99,  POSIX.1-2001  に準拠している。  関数
       rand_r()  は POSIX.1-2001 に由来する。 POSIX.1-2008 は、 rand_r() を廃止予定としている。

注意

       rand()   と srand()  の Linux C Library 版は、 random(3)  と srandom(3) の両関数と同じ乱数
       生成 アルゴリズムを使用している。そのため、下位のビットは上位のビットと 同じくらいにランダ
       ムである。 しかし、旧版の rand()  の実装や、他のシステムの現在の実装では、下位のビットが上
       位のビットほど ランダムになっていない。移植性を高める場合でも、精度の高い乱数が必要な アプ
       リケーションではこの関数は使用してはいけない (代わりに random(3)  を使うこと)。

       POSIX  1003.1-2003  では、 rand()  と srand() の実装例として以下を挙げている。これは、異な
       る2つのマシンで同じ乱数系列が 必要な場合には便利であろう。

           static unsigned long next = 1;

           /* RAND_MAX を 32767 と仮定 */
           int myrand(void) {
               next = next * 1103515245 + 12345;
               return((unsigned)(next/65536) % 32768);
           }

           void mysrand(unsigned int seed) {
               next = seed;
           }

       以下のプログラムを使うと、特定の乱数の種が与えられた場合に rand() が生成する疑似乱数系列を
       表示することができる。

           #include <stdlib.h>
           #include <stdio.h>

           int
           main(int argc, char *argv[])
           {
               int r, nloops;
               unsigned int seed;

               if (argc != 3) {
                   fprintf(stderr, "Usage: %s <seed> <nloops>\n", argv[0]);
                   exit(EXIT_FAILURE);
               }

               seed = atoi(argv[1]);
               nloops = atoi(argv[2]);

               srand(seed);
               for (int j = 0; j < nloops; j++) {
                   r =  rand();
                   printf("%d\n", r);
               }

               exit(EXIT_SUCCESS);
           }

関連項目

       drand48(3), random(3)

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの
       説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。

                                            2020-11-01                                    RAND(3)