この章では、乱数についてやりますが、乱数を発生させる方法は、非常に簡単です。なお、今回使う「rand」「srand」関数は「stdlib.h」に定義されています。
/*01*/ #include <stdio.h>
/*02*/ #include <stdlib.h>
/*03*/
/*04*/ main()
/*05*/ {
/*06*/ int x, i;
/*07*/
/*08*/ printf("電子さいころです。\n");
/*09*/ for(i = 1; i < 5; i++){
/*10*/ x = rand() % 6 + 1;
/*11*/ printf(" %d 回目は %d が出ました。\n", i, x);
/*12*/ }
/*13*/
/*14*/ return 0;
/*15*/ }
乱数を発生させるには
さて、rand 関数は「0~32767」までの値を返してくるので、さいころのように「1~6」までの値がほしい場合は、「6」で割った「余り」を使います。つまり「%」演算子ですね。ただ、「6」で割った場合の余りは「0~5」ですから「1」足します。
しかし、このままでは問題があります。このプログラムをコンパイルしたら、連続して2、3回実行してみてください。すると、見てわかると思いますが、まったく同じ順で値が出力されてしまいます。これは「種」をまいていないからです。では、種をまきましょう。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
main()
{
int x, i;
srand((unsigned int)time(NULL));
printf("電子さいころです。\n");
for(i = 1; i < 5; i++){
x = rand() % 6 + 1;
printf(" %d 回目は %d が出ました。\n", i, x);
}
return 0;
}
rand 関数にとって「種をまく」とは、いわば「初期化する」という意味になります。
srand 関数の引数は「unsigned int」型です。とはいえ、ここに「1」とか「2」とかの定数を書いては意味がありません。種が同じになってしまっては、毎回同じパターンの値になってしまいます。そこで、可変的な種として普通は「時間」を使います。つまり time 関数ですね。ただし、time 関数の戻り値は time_t 型なので、「unsigned int」に型キャストして使ってください。
ちなみに、srand 関数はプログラムの最初で一度だけ使えば、以降の rand 関数すべてに有効です。