疑似乱数を使用した簡単なゲームの作成


 
 乱数を用いたサイコロのシミュレーション 

   コンピュータでいろいろな現象をシミュレーションする場合にランダムな値を自動的に作成したいことがある。
  このとき、言語が予め用意している乱数(正確には擬似乱数という)ルーチンを用いると便利である。
   しかし、この擬似乱数は、結局計算で求めるため乱数の種(seed)という値を同じに設定すると、
  毎回同じ値から始まってしまう。これを回避するには、現在の時刻から得た数値を種にする方法や
  ユーザーに任意のタイミングでキー入力(トランプのシャッフルにおけるストップと似ている)してもらうなどの
  方法がある。
   本授業では、乱数の使い方の一例を紹介するに留める。
   
   以下のプログラムは、乱数ルーチンを用いて、1〜6までの整数を作り出す関数を作成し、
  120万回その関数を呼び出して、数のばらつき具合を調べるものである。 

       実行までは多少面倒である。 次のファイルを必ずその表示名(拡張子.c)でメインのプログラムと
  同じフォルダに保存(作成)してほしい。
     ● mytmut.c 
  コンパイル方法はこれまでと同じでよい。
   なお、初学者が自分で用いる際は11行目とmain{ }の中を変更するだけでよく、
  関数 randomseed の中はブラックボックスでかまわない。
   
 


 ● 乱数を用いたサイコロのシミュレーション 
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
/*  rand6.c  */
 
#include <stdio.h>
#include <stdlib.h>
#include "mytmut.c"
 
int mkrand6(void)
{
    double rd,rc;
    int r,rm;
    rm=6;
    rd=(rand()*1.0)/(RAND_MAX*1.0);
    rc=rd*rm+1.0;
    r=rc;
    if (rc<(1.0))    { r=1; }
    if (rc>(rm*1.0)) { r=rm; }
    return r;
}
 
void randomseed(void)
{
    int seed;
    int tm;
    tm=tmget();
    seed=tm-tm/65536*65536;
    srand(seed);
}
 
int main(void)
{
    int dice[6];
    int i,r,dn,n;
    double p;
    dn=6;
    n=1200000;
    randomseed();
    for (i=0; i<dn; i++) {
        dice[i]=0;
    }
    for (i=0; i<n; i++) {
         r=mkrand6()-1;
         dice[r]=dice[r]+1;
    }
    for (i=0; i<dn; i++) {
        p=(dice[i]*1.0)/(n*1.0);
        printf("Dice No.%d  => %d : %f \n",i+1,dice[i],p);
    }
 
    return 0;
}
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
-
-
-
乱数を使うのに必要 
時間を得るのに必要 
-
1から6までの整数を作る乱数関数 
-
-
-
ここを変えるとrmまでの整数となる 
-
-
-
-
-
-
-
-
乱数の種を時間を関数として設定する 
-
-
-
-
-
-
-
-
-
-
配列変数の要素は0〜5
(Base0)
-
-
-
乱数の種を設定
-
-
-
-
6までの整数−1をrに代入
-
-
-
-
-
-
-
-
-

 


    疑似乱数を使用した数当てゲームプログラム

        条件判断のところで出てきた数当てゲームにおいて、出題をコンピュータが行うものを紹介しよう。

        これまでのように上記テキストに名前を付けて保存し、コンパイル後、実行する。
       (必ず上のプログラムで説明した mytmut.c が同じフォルダに必要である。)

  (I) 解答者は、2つの4ケタの整数b、cを入力するか、最初のに1〜999までの整数bと正解候補をcを入れる。
    なお、bに0以下の整数を入れるとゲームを強制終了する。
  (II) プログラムは(2−1)か(2−2)かを判断して解答する。(2−2)かつ正解でなければ、解答者は(I)を繰り返す。
  (III) 正解がでると、スコア(回数)を表示して終了する。

        12回以下をめざそう!!

 戻る