圓周率π是個古老的東西,早在1700多年前祖沖之已將其值精確到小數(shù)點(diǎn)后7位,而如今通過計(jì)算機(jī)程序已能算到十億位之多!我是個圓周率愛好者,這個“愛好”至少是出于對這個無理數(shù)的熱衷,我不但可以背誦到小數(shù)點(diǎn)后100位,而且還收藏著從網(wǎng)上找到幾個計(jì)算π的程序,你有興趣可以到我的小站nihg.yeah.net找一下。
一、模擬器原理
本程序并使用計(jì)算π值的算法,她只是一個概率模擬,即在邊長為200的正方形內(nèi)隨機(jī)產(chǎn)生多個點(diǎn),將點(diǎn)以圓弧為界分開統(tǒng)計(jì),由于點(diǎn)的個數(shù)很多,直至幾乎布滿整個區(qū)域。此時,點(diǎn)的個數(shù)就可以看作就是它所在區(qū)域的面積。可以得到如下推導(dǎo):
藍(lán)色區(qū)內(nèi)點(diǎn)個數(shù):總個數(shù)≈藍(lán)色面積:總面積
藍(lán)色區(qū)內(nèi)點(diǎn)個數(shù):總個數(shù)≈圓面積/4:總面積
藍(lán)色區(qū)內(nèi)點(diǎn)個數(shù):總個數(shù)≈π×200×200/4:200×200
π≈ 4×藍(lán)色區(qū)內(nèi)點(diǎn)個數(shù)/總個數(shù)
當(dāng)然,點(diǎn)的位置會重復(fù),所以結(jié)果與π值是有差別的,不過,當(dāng)點(diǎn)足夠多時,可以看到一個非常接近的結(jié)果。
二、程序設(shè)計(jì)
打開Delphi 7,首先按照圖1設(shè)計(jì)窗體:
程序首先在Image1控件區(qū)域內(nèi)畫一個邊長為200的正方形作為程序的演示窗口,故FormCreate事件如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
// 畫亮綠色的正方形演示框
Image1.Canvas.Brush.Color:=clBlack;
Image1.Canvas.FillRect(Rect(0,0,199,199));
Image1.Canvas.Pen.Color:=cllime;
Image1.Canvas.Rectangle(0,0,199,199);
DoubleBuffered := True;
end;
接著放入一個Timer實(shí)現(xiàn)點(diǎn)的繪制以及π的計(jì)算:
procedure TForm1.Timer1Timer(Sender: TObject);
var
a,b,i,ii:longint;
pi,piok:single;
begin
// 隨機(jī)產(chǎn)生坐標(biāo)點(diǎn)
i:=random(200);
ii:=random(200);
if (i*i+ii*ii<40000) then
begin
一、模擬器原理
本程序并使用計(jì)算π值的算法,她只是一個概率模擬,即在邊長為200的正方形內(nèi)隨機(jī)產(chǎn)生多個點(diǎn),將點(diǎn)以圓弧為界分開統(tǒng)計(jì),由于點(diǎn)的個數(shù)很多,直至幾乎布滿整個區(qū)域。此時,點(diǎn)的個數(shù)就可以看作就是它所在區(qū)域的面積。可以得到如下推導(dǎo):
藍(lán)色區(qū)內(nèi)點(diǎn)個數(shù):總個數(shù)≈藍(lán)色面積:總面積
藍(lán)色區(qū)內(nèi)點(diǎn)個數(shù):總個數(shù)≈圓面積/4:總面積
藍(lán)色區(qū)內(nèi)點(diǎn)個數(shù):總個數(shù)≈π×200×200/4:200×200
π≈ 4×藍(lán)色區(qū)內(nèi)點(diǎn)個數(shù)/總個數(shù)
當(dāng)然,點(diǎn)的位置會重復(fù),所以結(jié)果與π值是有差別的,不過,當(dāng)點(diǎn)足夠多時,可以看到一個非常接近的結(jié)果。
二、程序設(shè)計(jì)
打開Delphi 7,首先按照圖1設(shè)計(jì)窗體:
程序首先在Image1控件區(qū)域內(nèi)畫一個邊長為200的正方形作為程序的演示窗口,故FormCreate事件如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
// 畫亮綠色的正方形演示框
Image1.Canvas.Brush.Color:=clBlack;
Image1.Canvas.FillRect(Rect(0,0,199,199));
Image1.Canvas.Pen.Color:=cllime;
Image1.Canvas.Rectangle(0,0,199,199);
DoubleBuffered := True;
end;
接著放入一個Timer實(shí)現(xiàn)點(diǎn)的繪制以及π的計(jì)算:
procedure TForm1.Timer1Timer(Sender: TObject);
var
a,b,i,ii:longint;
pi,piok:single;
begin
// 隨機(jī)產(chǎn)生坐標(biāo)點(diǎn)
i:=random(200);
ii:=random(200);
if (i*i+ii*ii<40000) then
begin