Shammer's Philosophy

My private adversaria

rand と srand

C言語で乱数を生成する場合にどうするか?
その際に使うのが rand 関数と srand 関数だ。
これを組み合わせて乱数を生成する。
まず、 rand 関数を実行して、その結果を出力してみる。


 main()
 {
  int i = 0;
  for( i = 0 ; i < 20 ; i++ ) {
   int x = 1 + rand() % 9;
   printf("%d\n", x);
  }
  return 0;
 }


ところが、これだけだと毎回同じ出力になる。Cの場合はこれだけではNGで、
srand()を使って乱数生成の元となる値を指定してやる必要がある。
rand() 実行前に、srand(time(NULL)) など実行してやるとよい。
別に time 関数を使わなくても、プログラム実行のたびに
ユーザーに適当な値を入力させてもいいが。
rand() は乱数生成関数に違いないが、生成基準となる値は固定らしく、
これを書き換えない限りは常に同じ乱数が生成される。
これでは乱数にならないので、srand() で乱数生成基準値を書き換える、
というのがCでのやり方のようだ。


そもそもなぜrandだけで乱数を作れなくしているか、という点は、
プログラミングのデバッグも関わってくる話のようだ。
乱数を生成したいが、意図的に(テスト用に)毎回同じ乱数を作ってくれないと困る、
というケースに対応できるようにするためらしい。
これは覚えておかないととんでもないミスにつながりそうだ。