擬似乱数生成の関数(C言語学習中)

今日覚えたこと

  • rand関数を使用して擬似乱数列を作る
    • しかし、rand関数をそのまま使うと、種に定数1が使用されてしまう
    • そのため、rand関数より前で、srand関数を呼び出す
      • srand関数は、擬似乱数系列生成の種に値を設定することで、乱数の発生系列を変更する
  • rand関数で返される整数nは、0 <= n <= RAND_MAX
    • 自分の環境では32767。この値は、MAXの最低値とされている。

srand関数を調べていたら、srandというページに行き着きました。

上のページの「注意」の項に、srand関数の使い方でやってはいけないこととして、ループ内で種に現在時刻を与えて何度も呼び出すことが挙げられています。現在時刻の値を種に使うと、ループが回る速度がそれ以上のために、同一の種で何度も擬似乱数系列を生成するためとのことです。

試すと確かにそうなりました。# 以下を実行しても、同じ擬似乱数系列が100個表示されるダケ

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

int main (void){
    int hoge;
    int i;
    int j;

    for(i = 0; i < 100; i++){
        srand(time(NULL));
        printf("ギジ乱数系列その%d : ", i + 1);
        for(j = 0; j < 10; j++){
            hoge = rand() % 1000;
            printf("%d ", hoge);
        }
        printf("\n");
    }
    return 0;
}

もちろん、時刻の有効な値がループの回る時間よりも小さければ問題ないでしょうけど、そうじゃないということですよね。しかし、time関数はまだよく把握できていません。また今度。

今日の先送り

scanfでハマると投げ出しそうなので、寝かせることにしました。あとでわかるでしょう(と思いこむ)