Cでベルトランのパラドックス
円の弦を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)で
読み込ませることができます。