Cでベルトランのパラドックス

 

円の弦を1本無作為に選び、その長さが、

円に内接する正三角形の辺より長い確率は?

 

詳しくは

リニューアル記事

N88-BASICでベルトランのパラドックス (1回目)

を見て下さい

 

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

110 ' ベルトランのパラドックス(Bertrand paradox)

120 '

130 ' r = 1の円に内接する一辺√(3)の正三角形がある

140 ' 無作為に置いた直線の円内の長さが√(3)より大きい確率

150 '

160 ' 一様分布した弦から無作為に選んだ弦が√(3)より大きい確率

170 ' を考えたつもりです。

180 '---------------------------------------------------------------------

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

200 A = SQR(3)                          '--- 正三角形の辺

210 L = 0                               '--- 長かった数

220 FOR I=1 TO 10000                    '--- 回数

230   X = RND(1)                        '--- 1をどうしようかな?

240   Y = 2 * SQR(1 - X*X)              '--- 弦の長さ

250   IF Y > A THEN L = L + 1

260   IF I MOD 1000 THEN *NOPRINT

270     PRINT USING "I =######## , "; I;

280     PRINT USING "P = #.#####"   ; L / I

290   *NOPRINT

300 NEXT

 

BASICでは0~1未満の乱数を使用していましたが、

以下の、Cでは0~1以下の乱数を返す関数を定義しています。

 

/*

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

 ベルトランのパラドックス(Bertrand paradox)

 

 r = 1の円に内接する一辺√(3)の正三角形がある

 無作為に置いた直線の円内の長さが√(3)より大きい確率

 

 一様分布した弦から無作為に選んだ弦が√(3)より大きい確率

 を考えたつもりです。

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

*/

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

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

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

#include <math.h>       /* sqrt(√)を使用するため  */

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

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

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

    return rand() / (double)RAND_MAX; /* 0~1にする */

}

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

void main(void)

{

    double a, x, y;                 /* 実数変数の定義(倍精度) */

    int    i, l;                    /* 整数変数の定義     */

 

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

    a = sqrt(3.0);                  /* 正三角形の辺(3.0は実数) */

    l = 0;                          /* 長かった数 */

    for (i = 1; i <= 10000; i++)    /* 回数 */

    {

        x = rnd1();                 /* 0~1の乱数 */

        y = 2.0 * sqrt(1.0 - x*x);  /* 弦の長さ */

        if (y > a) l++;

        if ((i % 1000) == 0)

        {

            printf("i =%8d , ", i );

            printf("p = %7.5f\n", l / (double)i );

        }

    }

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

}

 

Cコンパイラなどの開発環境は別途用意して下さい。

 

BASICインタプリタ下記リンクよりダウンロードできます。

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

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

このBASICプログラムもダウンロードできますが

上記リストをCopy&paste(NL-BASIC側はAlt+v)で

読み込ませることができます。