srand

擬似乱数の発生系列を変更する

【書式】
#include <stdlib.h>
void srand(unsigned seed);

【説明】
乱数とは、要は「でたらめな値」ですが、コンピュータ内ではある規則に従って「でたらめな値」を生成しています。これを擬似乱数と言い、C言語では rand関数を使って発生させます。

srand関数は rand関数で発生させる擬似乱数の発生系列を変更します。srand関数の引数seedに同じ数値を与えると、rand関数は同じ繰返しで擬似乱数を発生させます。たとえば、下の使用例1では同じ seed で10回 srand関数を呼んでいますが、結果を見ると、10回とも同じ繰返しでrand関数は擬似乱数を発生させています。
また、srand関数を呼ばずにrand関数を実行した場合には、srand関数でseedに1を設定したことと同じになり、プログラムを何度実行しても同じ繰り返しで擬似乱数を発生します。

プログラムを実行するたびに異なる系列で擬似乱数を発生させるには、通常seedに現在時刻を設定します。現在時刻はtime関数で取得します。使用例2では現在時刻を設定してsrand関数を呼んでから、10回×10回 rand関数を呼んでいます。結果を見ると、不規則に擬似乱数を発生させていますね。
現在時刻は同じ値が存在することはありませんので、seedに現在時刻を設定すればプログラムを実行するたびに異なる系列で擬似乱数を発生させることができるのです。

【引数】
unsigned seed : 擬似乱数の発生系列を変更する種。
            同じ数値を設定すると同じ繰返しでrand関数は擬似乱数を発生する。

【戻り値】
なし
【使用例1】
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
        int i,j;

        for (i=1; i<=10; i++) {
                /* 乱数系列の変更 */
                printf("seed:10 %2d回目  ",i);
                srand(10);
                /* 1〜100の擬似乱数を10個発生 */
                for (j=0; j<10; j++) {
                        printf("%3d ",rand()%100+1);
                }
                printf("\n");
        }
        return 0;
}
【実行結果例】
seed:10  1回目   44  15  46  71  88  35  63  93  56  11 
seed:10  2回目   44  15  46  71  88  35  63  93  56  11 
seed:10  3回目   44  15  46  71  88  35  63  93  56  11 
seed:10  4回目   44  15  46  71  88  35  63  93  56  11 
seed:10  5回目   44  15  46  71  88  35  63  93  56  11 
seed:10  6回目   44  15  46  71  88  35  63  93  56  11 
seed:10  7回目   44  15  46  71  88  35  63  93  56  11 
seed:10  8回目   44  15  46  71  88  35  63  93  56  11 
seed:10  9回目   44  15  46  71  88  35  63  93  56  11 
seed:10 10回目   44  15  46  71  88  35  63  93  56  11 
【使用例2】
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main(void)
{
        int i,j;

        /* 乱数系列の変更 */
        srand((unsigned) time(NULL));

        /* 1〜100の擬似乱数を10個ずつ10行発生 */
        for (i=1; i<=10; i++) {
                for (j=0; j<10; j++) {
                        printf("%3d ",rand()%100+1);
                }
                printf("\n");
        }
        return 0;
}
【実行結果例】
 80  83  74   5  22  36   7  53  93  66 
 79  86  22  50  10  55  67   3   8  38 
  8  99  23   3  21   9   2  28  31  75 
 28  86  16  83  37  84  53   9   1  59 
 38  31  10  50  75  75  16  10  25  38 
  8  28  64  65  25  52  58   8  60  43 
 45   7  49  29  33  40  99  28  72  18 
 29  35  54  62   7  65   3  22  26  18 
 88  34  90  75   4  23  44  93  28  22 
 72  67  65  22  41  20  56  33 100   8 
【注意】
srandを使った不具合で、ループの中でrandとsrandをセットで使う例があります。ループの中でrandのたびにsrandを直前に実行させるわけですが、コンピュータの処理は大変に早いので、現在時刻をseedに設定していると、ループの中で連続して同じseedでsrandを実行することになってしまいます。つまり、1秒間は同じ擬似乱数が発生することになってしまうのです。
srandはプログラムの先頭で1回実行してやると、あとは異なる擬似乱数を発生し続けますので、srandの実行はプログラム先頭1回のみにしましょう。

(例)
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main(void)
{
        int i,j;

        /* 1〜100の擬似乱数を10個ずつ10行発生 */
        for (i=1; i<=10; i++) {
                for (j=0; j<10; j++) {
                        /* 乱数系列の変更をループ中で実行 */
                        srand((unsigned) time(NULL));
                        printf("%3d ",rand()%100+1);
                }
                printf("\n");
        }
        return 0;
}
(結果例)
 52  52  52  52  52  52  52  52  52  52 
 52  52  52  52  52  52  52  52  52  52 
 52  52  52  52  52  52  52  52  52  52 
 52  52  52  52  52  52  52  52  52  52 
 52  52  52  52  52  52  52  52  52  52 
 52  52  52  52  52  52  52  52  52  52 
 52  52  52  52  52  52  52  52  52  52 
 52  52  52  52  52  52  52  52  52  52 
 52  52  52  52  52  52  52  52  52  52 
 52  52  52  52  52  52  52  52  52  52 

戻る


banner
初心者のためのポイント学習C言語」
Copyright(c) 2000-2004 TOMOJI All Rights Reserved