Cでモンティホール問題

 

N88-BASICでモンティホール問題

Cで書いて見ました。

Cコンパイラなどの環境は別途ご用意ください。

 

if (a == 0) sta++;

Cでは比較に=は使用できません。

C     ==  >=  <=  !=

BASIC =   >=  <=  <>

Cでは、i = i + 1; を、i += 1; や、i++;と書けます。

 

if ((i % 10000) == 0)

余りは、BASICはMOD、Cは%です。

 

printf("Change = %8d , Stay = %8d , ", cha, sta);

%8dは整数を少なくとも8桁表示する。

printf("Change/Stay = %7.5f\n", cha / (double)sta);

%7.5fは実数を小数点以下5桁で、

全体で少なくとも7文字(.含む)表示する。

cha / (double)sta

は、int/doubleとなり、doubleとして計算してくれる。

 

CとBASICのLISTです。

 

/*

---------------------------------------------------------------------

 モンティ・ホール問題(Monty Hall problem)

 

 当たりが1つの3doorから1つを選ぶ

 残り2つの内、外れを開けてもらえる

 残り1つに変えるか、そのままか、どちらが得

---------------------------------------------------------------------

*/

#include <stdio.h>      /* printfを使用するため   */

#include <stdlib.h>     /* rand,srandを使用するため */

#include <time.h>       /* clockを使用するため   */

static  /* このファイル内部のみで使用できる関数の定義 */

double rnd(void)

{

    return ((double)rand()) / (((double)RAND_MAX)+1.0);

}

/* main関数から実行される */

void main(void)

{

    int cha, sta, i, a, b;      /* 変数の定義    */

 

    srand(clock());             /* 乱数の種     */

    cha = 0;                    /* 変えて当たった数 */

    sta = 0;                    /* 変えず当たった数 */

    for (i = 1; i <= 100000; i++)   /* ゲーム回数  */

    {

        a = (int)(rnd() * 3);   /* a:0-2選択(0を当たりとする)  */

        b = (a)? 0 : (int)(rnd() * 2)+1;    /* b:0-2開いた残り */

        if (a == 0) sta++;      /* aのままで当たった数     */

        if (b == 0) cha++;      /* bに変えて当たった数     */

        if ((i % 10000) == 0)

        {

            printf("Change = %8d , Stay = %8d , ", cha, sta);

            printf("Change/Stay = %7.5f\n", cha / (double)sta);

        }

    }

    getchar();                  /* キー入力待ち */

}

 

monty001n.bas

 

100 '---------------------------------------------------------------------

110 ' モンティ・ホール問題(Monty Hall problem)

120 '

130 ' 当たりが1つの3doorから1つを選ぶ

140 ' 残り2つの内、外れを開けてもらえる

150 ' 残り1つに変えるか、そのままか、どちらが得

160 '---------------------------------------------------------------------

170 RANDOMIZE VAL(RIGHT$(TIME$,2)) '--- 乱数の種

180 CHA = 0                        '--- 変えて当たった数

190 STA = 0                        '--- 変えず当たった数

200 FOR I=1 TO 100000              '--- ゲーム回数

210   A = INT(RND(1) * 3)          '--- A:0-2選択(0を当たりとする)

220   IF A     THEN B = 0 ELSE B = INT(RND(1) * 2)+1 '--- B:0-2開いた残り

230   IF A = 0 THEN STA = STA + 1  '--- Aのままで当たった数

240   IF B = 0 THEN CHA = CHA + 1  '--- Bに変えて当たった数

250   IF I MOD 10000 THEN *NOPRINT

260     PRINT USING "Change = ######## , Stay = ######## , "; CHA; STA;

270     PRINT USING "Change/Stay = #.#####"; CHA / STA

280   *NOPRINT

290 NEXT

 

NL-BASICは、下記リンクよりダウンロードできます。

NL-BASIC(N88-BASIC互換?)ホームページへのリンク

Readme.txtを読んで、遊んで見て下さい。