数当てゲーム実行例とヒント

実行例

プログラムを起動すると、以下のようになるものを想定している。

% ./kazuate
1〜10までの数を当てて下さい。
どの数だと思いますか?: 3
違うなあ。
どの数だと思いますか?: 8
違うなあ。
どの数だと思いますか?: 5
ビンゴ!!

メッセージは自分で面白おかしく適当に考えて良い。余裕があれば、

などの拡張を加えると良い。

ヒント

乱数(厳密には擬似乱数)を発生するには、random() 関数を 使う。random() 関数は、呼ぶごとに long 型の 整数である擬似乱数を作って返してくれる。 random() 関数の利用には、

#include <stdlib.h>

が必要である。10個の乱数を表示するプログラムは以下のようになる。

random.c

#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>

が必要である。まとめると、乱数の種を毎回違うものにして乱数を 利用するには、以下のようになる。

random2.c

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

int main()
{
  int i;                        /* ループ用変数 */
  srandom(time(NULL));
  for (i=0; i&lt;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を足せば良い。


本日の課題