プログラムを起動すると、以下のようになるものを想定している。
% ./kazuate 1〜10までの数を当てて下さい。 どの数だと思いますか?: 3 違うなあ。 どの数だと思いますか?: 8 違うなあ。 どの数だと思いますか?: 5 ビンゴ!!
メッセージは自分で面白おかしく適当に考えて良い。余裕があれば、
などの拡張を加えると良い。
乱数(厳密には擬似乱数)を発生するには、random()
関数を
使う。random()
関数は、呼ぶごとに long
型の
整数である擬似乱数を作って返してくれる。
random()
関数の利用には、
#include <stdlib.h>
が必要である。10個の乱数を表示するプログラムは以下のようになる。
#include <stdio.h> #include <stdlib.h> int main() { int i; /* ループ用変数 */ for (i=0; i<10; i++) { printf("%ld\n", random()); } }
ただし、実際に実行してみれば分かるが random()
関数は
何度やっても同じ結果が返って来る。違う結果を返させたいときには
srandom()
関数に種となる数値を与える。
srandom(50);
これも、50などの定数を与えると毎回同じ乱数の種になるので、普通は
現在時刻をsrandom
関数に与える。現在時刻を得る関数は
time()
関数で、time(NULL)
とすると、
現在時刻が秒で得られる。time()
関数の利用には
#include <time.h>
が必要である。まとめると、乱数の種を毎回違うものにして乱数を 利用するには、以下のようになる。
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i; /* ループ用変数 */ srandom(time(NULL)); for (i=0; i<10; i++) { printf("%ld\n", random()); } }
発生した乱数を指定した範囲内の整数におさめたいときは、割り算の余り(剰
余)である %
演算をすれば良い。自然数Nの剰余を求めると
かならず余りは 0〜N-1 になる。0〜9の乱数を10個求めるプログラム
random3.c
は以下のようになる。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int i; /* ループ用変数 */
srandom(time(NULL));
for (i=0; i<10; i++) {
printf("%ld\n", random()%10);
}
}
もし、1〜10の乱数を作りたかったら、rand()%10
の
結果に1を足せば良い。