圓周率π是個古老的東西,早在1700多年前祖沖之已將其值精確到小數(shù)點后7位,而如今通過電腦程序已能算到十億位之多!我是個圓周率愛好者,這個“愛好”至少是出于對這個無理數(shù)的熱衷,我不但可以背誦到小數(shù)點后100位,而且還收藏著從網(wǎng)上找到的幾個計算π的程序,你有興趣可以到我的小站nihg.yeah.net找一下。文章中的源程序以及可執(zhí)行程序可以在http://www.cfan.com.cn/11program/200502/htkdma.html找到。 1.模擬器原理
本程序并不使用計算π值的算法,它只是一個概率模擬,即在邊長為200的正方形內(nèi)隨機產(chǎn)生多個點,將點以圓弧為界分開統(tǒng)計,由于點的個數(shù)很多,直至幾乎布滿整個區(qū)域。此時,點的個數(shù)就可以看作就是它所在區(qū)域的面積。可以得到如下推導(dǎo):
(1)藍色區(qū)內(nèi)點個數(shù):總個數(shù)≈藍色面積:總面積
(2)藍色區(qū)內(nèi)點個數(shù):總個數(shù)≈圓面積/4:總面積
(3)藍色區(qū)內(nèi)點個數(shù):總個數(shù)≈π×200×200/4:200×200
(4)π≈ 4×藍色區(qū)內(nèi)點個數(shù)/總個數(shù)
當(dāng)然,點的位置會重復(fù),所以結(jié)果與π值是有差別的,不過,當(dāng)點足夠多時,可以看到一個非常接近的結(jié)果。
2.程序設(shè)計
打開Delphi 7,首先按照圖1設(shè)計窗體(見圖)。
程序首先在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實現(xiàn)點的繪制以及π的計算: procedure TForm1.Timer1Timer(Sender: TObject); var a,b,i,ii:longint; pi,piok:single; begin // 隨機產(chǎn)生坐標(biāo)點 i:=random(200); ii:=random(200); if (i*i+ii*ii<40000) then begin // 以200為半徑的圓內(nèi)的點設(shè)為藍色 Image1.canvas.Pen.Color:=claqua; a:=StrToInt(Label1.Caption); Label1.Caption:=IntToStr(a+1); //顯示當(dāng)前點的坐標(biāo) Label6.Caption:=IntToStr(Image1.Canvas.PenPos.X); Label7.Caption:=IntToStr(Image1.Canvas.PenPos.Y); end else begin // 超出這個區(qū)域的點都在圓外設(shè)為黃色 Image1.Canvas.Pen.Color:=clyellow; b:=StrToInt(Label2.Caption); Label2.Caption:=IntToStr(b+1); end; // 畫點(長為1像素的直線) Image1.Canvas.MoveTo(i,ii); Image1.Canvas.LineTo(i,ii+1); // 計算pi的值 pi:=(4*(StrToInt(Label1.Caption))/(StrToInt(Label1.Caption)+StrToInt(Label2.Caption))); Label3.Caption:=FloatToStr(pi); // Label4顯示的是最接近真實pi的值。 piok:=StrToFloat(Label4.Caption); //得出最接近的圓周率值 piok if (abs(pi-3.141592653589))<(abs(piok-3.141592653589)) then Label4.Caption:=FloatToStr(pi); end;

最后加入兩個SpeedButton作為開始和暫停按鈕,代碼分別是Timer1.EnableD:=true;和Timer1.EnableD:=false;。好了,程序這樣就完成了,趕快按下F9親自模擬一下π的計算吧!
3.小結(jié)
雖然程序并沒有采用圓周率的算法,但能通過隨機數(shù)對π進行逼近,而由無數(shù)點描成的美妙圓弧讓我們嘆為觀止。其實,這樣的思想可以用于許多場合,比如對某個數(shù)學(xué)定理或者自然規(guī)律進行模擬,希望這樣的思路對您有所啟發(fā)。
|