提出用ではない。
やっぱりアルファベットが並んでいるとプログラミング言語らしい。
乱数をきちんと発生させているつもりなのに、十字の模様がうっすらと見えてしまう。
乱数生成まで自分で書かなければならないかも。
//モンテカルロ
title "モンテカルロ?"
//使用変数(円)
max_in = 1000000 ; 総ドット数(入力用
max = 0;
in_dot = 0; ; 内部ドット数
rest = 10000 ; await をいれる間隔
visible = 0 ; 1 で、描画過程を表示する
vx = 390 : vy = 00 ; 表示座標
r = 200 ; 半径
pi = 0 ; 求めるpi
//グラフ
graph_x = 100 : graph_y = 450
graph_w = 600 : graph_h = 150
randomize ; 乱数初期化
rand_max = 32768 ; 乱数の最大値
//メインウィンドウ初期化
screen 0, 800, 600
//コントロールの配置
objsize 200, 25
pos 0, 25 : combox dimensions, 100, "円\n球"
pos 120, 0 : chkbox "過程描画", visible_chk
pos 0, 55 : mes "ドット数"
pos 80, 55 : input max_in, 120, 25
pos 0, 80 : mes "内部ドット数"
line 0, 100, 100, 100
pos 0, 102 : mes "全ドット数"
pos 100, 90 : mes "x volume="
//数式を読む
pos 25, 200 : picload "eq.jpg", 1
objsize 200, 45
pos 0, 350 : button "Start",*start
obj_start = stat
//軸の描画
line vx-3, vy, vx-3, vy+2*r
line vx, vy+2*r + 3, vx+2*r, vy+2*r + 3
//目盛の描画
pos vx-20, vy : mes "1"
line vx-9, vy, vx-3, vy
pos vx-20, vy+r : mes "0"
line vx-9, vy+r, vx-3, vy+r
pos vx-20, vy+r*2 : mes "-1"
line vx-9, vy+r*2, vx-3, vy+r*2
line vx, vy+r*2+3, vx, vy+r*2+9
pos vx+r-9, vy+r*2+6 : mes "0"
line vx+r, vy+r*2+3, vx+r, vy+r*2+9
pos vx+r*2-9, vy+r*2+6 : mes "1"
line vx+r*2, vy+r*2+3, vx+r*2, vy+r*2+9
//グラフ軸の描画
gosub *init_graph
stop
*start
dimension = dimensions//これ以降dimensions はない
max = max_in;
visible = visible_chk
//円描画用バッファ
buffer 2, r*2, r*2;
cls
if(visible == 1): gsel 0;
pos vx, vy
gcopy 2, 0, 0, r*2, r*2
//円を作る繰り返し
gosub *init_graph;
in_dot = 0
for i, 0, max, 1
//必要な値の計算
rx = rnd(rand_max) - rand_max/2;
ry = rnd(rand_max) - rand_max/2;
if(dimension == 1) : rz = rnd(rand_max) - rand_max/2:else:rz = 0;
len = sqrt(rx*rx + ry*ry + rz*rz)
px = rx * r / (rand_max / 2);
py = ry * r / (rand_max / 2);
//直接描画の場合、描画位置を座標に加算
if(visible == 1) : px += vx : py += vy ;
//色の指定
if (len/(32768/2) < 1){
in_dot ++
color 100, 100, 255
}else{
color 0, 0, 0
}
//描画
pset px + r, py+ r
//一定間隔で待機を行い、進行状況・円周率を表示
if(dimension == 0): vol = 4:else : vol = 8;
pi = (((1.0*in_dot)/(i+1))*vol)
if( i \ rest == 0){
prev = ginfo(3)
gsel 0
color 100, 100, 255
boxf 0, 0, 100, 10
color 0, 0, 0;
boxf 0, 0, (i * 100) / max, 10
color 255, 255, 255
boxf 180, 90, 300, 115
color 0, 0, 0
pos 180, 90
mes ""+pi//円周率
gsel prev
await 10
}
//グラフに打点すべきタイミング
if(max / graph_w < 1){
if(dimension == 0):def = 3.1416:else:def = 4.1888
prev = ginfo(3)
gsel 0
color 255,0,0
pset graph_x + i, graph_y + graph_h/2 - pi*500 + def*500
gsel prev
}else{
if(i\(max / graph_w) == 0){
if(dimension == 0):def = 3.1416:else: def = 4.1888
prev = ginfo(3)
gsel 0
color 255,0,0
pset graph_x + (1.0*i/max)*(graph_w), graph_y + graph_h/2 - pi*500 + def*500
gsel prev
}
}
next
gsel 0
color 0, 0, 0
boxf 0, 0, 100, 10
//非表示モードではまとめて円を描画
if(visible == 0) : pos vx, vy: gcopy 2, 0, 0, r*2, r*2
stop
*init_graph
if(dimensions == 0):def = 3.1416:else:def = 4.1888
prev = ginfo(3)
gsel 0
color 255, 255, 255
boxf 0, graph_y, graph_x + graph_w, graph_y + graph_h
color 0, 0, 0
pos 30, graph_y + graph_h/2 : mes ""+def
line 99, graph_y, 99, graph_y + graph_h
line 99, graph_y + graph_h/2, 700, graph_y + graph_h/2
pos 30, graph_y
mes "" + (def + (1.0 * graph_h / 500))
line 99, graph_y, graph_x + graph_w, graph_y
gsel prev
return ;