Cで確率

 

N88-BASICで確率をCで書いてみました。

 

CとBASICのLISTです。

/* ... */はコメントですので参考にして下さい。

出来るだけBASICに寄せて書いています。

CプログラムはCut&pasteして下さい。

Cコンパイラー環境は各自で準備して下さい。

 

/*

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

  コインを表が出るまで投げた回数nが奇数か偶数かを当てる確率

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

*/ 

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

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

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

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

double rnd(void)/* 引数(パラメータ)なし、関数の値double(実数) */

{               /* 0以上1未満の乱数を返す          */

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

}

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

void main(void)

{

    int odd, even, max, i, n;       /* 変数の定義        */

 

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

    odd  = 0;                       /* 奇数回で終了したゲーム数 */

    even = 0;                       /* 偶数回で終了したゲーム数 */

    max  = 1;                       /* 投げた回数の最大値    */

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

    {

        n = 0;                      /* 投げた回数        */

repeat:

        n++;                        /* 投げた回数(n = n + 1;)  */

        if (rnd() < 0.5) goto repeat;   /* 裏ならもう一度    */

        if (n % 2) odd++; else even++;

        if (n > max) max = n;       /* 投げた最大数       */

        if ((i % 10000) == 0)

        {

            printf("奇 = %8d , ", odd );

            printf("偶 = %8d , ", even);

            printf("奇/偶 = %8.5f\n", odd / (double)even);

        }

    }

    printf("max %d\n", max);

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

}

 

coin001.bas

 

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

110 ' コインを表が出るまで投げた回数nが奇数か偶数かを当てる確率

120 '---------------------------------------------------------------------

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

140 ODD  = 0                       '--- 奇数回で終了したゲーム数

150 EVEN = 0                       '--- 偶数回で終了したゲーム数

160 MAX  = 1                       '--- 投げた回数の最大値

170 FOR I=1 TO 10000               '--- ゲーム回数

180   N = 0                        '--- 投げた回数

190   *REPEAT

200     N = N + 1                  '--- 投げた回数

210   IF RND(1) < 0.5 THEN *REPEAT '--- 裏ならもう一度

220   IF N MOD 2 THEN ODD = ODD + 1 ELSE EVEN = EVEN + 1

230   IF N > MAX THEN MAX = N      '--- 投げた最大数

240   IF I MOD 1000 THEN *NOPRINT

250     PRINT USING "奇 =######## , "; ODD;

260     PRINT USING "偶 =######## , "; EVEN;

270     PRINT USING "奇/偶 =##.#####"; ODD / EVEN

280   *NOPRINT

290 NEXT

300 PRINT "max"; MAX

 

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

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

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