Category Archives: 1-7.ジェネレータ

C言語でシード値を変えずに乱数を使う

映画『ちはやふる上の句』 広瀬すず 野村周平 真剣佑

かっこいいです。かるたってスポーツなんですね。当然札は覚えておかないといけませんが、札の位置を覚えるのも競技なんですね。
頭脳が試されます。競技かるたをしている人たちに比べたら、私は常時頭止まっている状態だと思いました。
記憶力とか訓練しないといけない気持ちになりましたので、今回は記憶力の訓練ゲームを作ってみます。

C言語の乱数生成は、srandでシード値を変更して、randで乱数を得ますよね。

~$ cat -n r.c
     1	#include <stdlib.h>
     2	#include <stdio.h>
     3	#include <time.h>
     4	
     5	int main()
     6	{
     7		srand(time(NULL));
     8	
     9		printf("%d\n", rand() % 100);
    10	
    11		return 0;
    12	}
    13	

ビルドして、実行すると、当然毎回値が異なります。

~$ gcc -o r r.c
~$ ./r
98
~$ !!
./r
7
~$ !!
./r
96
~$ 

これを、srandを使用せずに、毎回固定の乱数を表示するようにして、ゲームに使用することができます。
アクションゲームなら敵の動きを同じにしたりすることができますね。

~$ mv r.c fix-r.c
~$ sed '/srand/d' -i fix-r.c
~$ gcc -o fix-r fix-r.c
~$ ./fix-r
83
~$ ./fix-r
83
~$ 

では、自分の記憶力の訓練用に作ったゲームのソースです。

     1	#include <stdlib.h>
     2	#include <stdio.h>
     3	
     4	int
     5	main ()
     6	{
     7	  int i, r, x;
     8	
     9	  for (i = 1; i <= 10; i++)
    10	    {
    11	      r = rand () % 100;
    12	      printf ("Q%d.数字の何が出ますか?\n", i);
    13	      scanf ("%d", &x);
    14	      if (x == r)
    15		{
    16		  printf ("正解です。\n");
    17		}
    18	      else
    19		{
    20		  printf ("不正解です。正解は%dでした\n", r);
    21		  printf ("GAME OVER\n");
    22		  return 0;
    23		}
    24	    }
    25	  printf ("全問正解です\n");
    26	  return 0;
    27	}

早速実行して、数を覚え、10問正解してみました。いやあえらく時間かかりましたよ。

~$ ./a.out
Q1.数字の何が出ますか?
83
正解です。
Q2.数字の何が出ますか?
86
正解です。
Q3.数字の何が出ますか?
77
正解です。
Q4.数字の何が出ますか?
15
正解です。
Q5.数字の何が出ますか?
93
正解です。
Q6.数字の何が出ますか?
35
正解です。
Q7.数字の何が出ますか?
86
正解です。
Q8.数字の何が出ますか?
92
正解です。
Q9.数字の何が出ますか?
49
正解です。
Q10.数字の何が出ますか?
21
正解です。
全問正解です
~$ 

10個の数字に苦労したので、百人一首など覚えられる気がしません。