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を読んで、遊んで見て下さい。