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)で
読み込ませることができます。
アキレスと亀のパラドックス
亀はアキレスより先から出発
速いアキレスでも今亀がいる所まで行くのに時間がかかる
その時間の間に遅い亀でも少しは前に進む
を繰り返すとアキレスは亀を抜けないパラドックス
この記事はリニューアルしました
https://ulprojectmail.blogspot.com/2021/12/n88-basiczeno-2.html
N88-BASICでゼノンの矢 (2回目)
アメブロ背景に任意の画像を表示する方法が
無いかと探していたら、見つけました。
勝手にリンクを貼っておきます。
画像付きで大変分かりやすく、この記事を
見ながら画像を貼りました。
まず、上記リンクの内容を実行する前に、
ブログのデザインの設定で、カテゴリから探すの
カスタム可能から、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です。
上記ホームページから最新バージョンをダウンロードできます。
VLBasic01.exeを実行するとVL-BASICが立ち上がります。
Readme.txtを読んで、サンプルプログラムやこのブログで
紹介しているプログラムを走らせる事ができます。
以下のリンクのPC-9801(N88BASIC)用お絵かきプログラムは
おすすめです。
あやおりとーの さんのホームページです。
元々このお絵かきプログラムを走らせたくて
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は、プリミティブという基本図形を組み合わせた
図形を表示する簡易型のレイトレーシングライブラリ
ですが、球のみ対応の半影を表示する機能や、
遅いですがパスレイトレーシングやフォトンマッピング
等の機能も利用できます。
まずはサンプルプログラムなどを書き換えたりして
遊んで見て下さい。