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)で

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

 

 

アメブロ背景に任意の画像を表示する方法が

無いかと探していたら、見つけました。

 

勝手にリンクを貼っておきます。

アメブロ 背景 画像 を設定する方法

 

画像付きで大変分かりやすく、この記事を

見ながら画像を貼りました。

 

まず、上記リンクの内容を実行する前に、

 

ブログのデザインの設定で、カテゴリから探すの

カスタム可能から、CSS編集用デザイン(表示方法の

違いで複数あるので画面をよく見て選んで下さい。)

を選んで設定しておいて下さい。

 

background:url(先ほどコピーしたURL) fixed;

または、

background:url(先ほどコピーしたURL);

background:url( と ); を忘れがちです。

 

背景で文字が見にくいときは、

color: #112233;font-size: 32px;

の112233はrrggbbでそれぞれ0-9,a-f(0~15)でrgbの

明るさを変える事が出来ます。

32pxの数値は文字サイズです。

 

画像のサイズや縦横比で配置のされ方が

異なるので苦労しましたが、何とか画像を

貼ることが出来ました。

 

昔PC-9801で遊んだという方、今は実機が手に入らなくてエミュレータも動かせないという方に、PC-9801を使っているような気分になれるソフト(for windows)を紹介します。

VL-BASIC,NL-BASIC開発者のULprojectです。

 

VL-BASICホームページへのリンク

 

NL-BASICホームページへのリンク

上記ホームページから最新バージョンをダウンロードできます。

 

VLBasic01.exeを実行するとVL-BASICが立ち上がります。

Readme.txtを読んで、サンプルプログラムやこのブログで

紹介しているプログラムを走らせる事ができます。

以下のリンクのPC-9801(N88BASIC)用お絵かきプログラムは

おすすめです。

 

BASICでお絵かき

あやおりとーの さんのホームページです。

 

元々このお絵かきプログラムを走らせたくて

1年前(2019年9月~11月)にVL-BASICを作りました。

 

PC-9801を使っている気分その1

 

長めのプログラムをLOADしてLISTを流している間に、

ctrl+q、ctrl+w、ctrl+shift+q、ctrl+shift+wを押して見て下さい。

PC-9801特有のスムーズスクロールを見ることができます。

PRINT文の繰り返し表示でもスムーズスクロールを見ることができます。(表示速度の問題で全角文字を使用していない

リストの方がスムーズです。)

 

PC-9801を使っている気分その2

 

まず、長めのプログラムをLOADしてEDITを実行し、

カーソル下でリストを画面いっぱいに表示させてか

カーソル上を押していくとリストが逆スクロールして表示

されます。PGUP、PGDNも再現しています。

 

PC-9801を使っている気分その他

 

monを使って直接Text-VRAMやGVRAMを書き換えてみる。

width 40,20でテキストの文字数をいじってみる。

ctrl+eでカーソル以降の文字を消してみるなど...。

 

アセンブラなどは非対応ですが、

NL-BASICではRGBプレーン方式のGVRAMなども

再現し、DEF SEG=&HA800:BLOAD "blue.bin"

などもできます。

 

BASICのみでPC-9801を使うなつかしさは

味わえると思います。

まずはVL-BASIC、NL-BASICで遊んでみて

N88-BASICを懐かしんで下さい。

 

VL-BASICでは、

1998年ごろに開発した簡易リアルタイム

レイトレーシングを利用できる拡張命令を搭載しています。

もともとOpenGLのレイトレーシング版を作ろうと思い

簡易版リアルタイムレイトレーシングライブラリUL

(user libraryという意味、未公開)を開発しました。

これをVL-BASICで使えるようにしました。

ULprojectはULの開発者という意味で名付けました。

ULは、プリミティブという基本図形を組み合わせた

図形を表示する簡易型のレイトレーシングライブラリ

ですが、球のみ対応の半影を表示する機能や、

遅いですがパスレイトレーシングやフォトンマッピング

等の機能も利用できます。

まずはサンプルプログラムなどを書き換えたりして

遊んで見て下さい。