[VBA ] 蒙地卡羅模擬法求圓周率

作者: markbaseball (Mark)   2015-03-24 19:40:45
求版上的高手幫我健檢一下,我的程式碼錯在哪裡了?
正確的話應該要從A1~C100和 D1的表格都要有值,但是卻只在C1出現了100.6402的值
以下是我的程式碼
Sub Monte_Carlo_PI()
Dim i As Long
Dim j As Long
Dim k As Long
Dim x As Double
Dim y As Double
Dim dist As Double
Dim ma As Long
ma = 100
Randomize
For i = 1 To ma
For j = 1 To ma
For k = 1 To ma
x = Rnd()
y = Rnd()
dist = (x - 0.5) ^ 2 + (y - 0.5) ^ 2
If dist <= 0.25 Then
dist = dist * 4
Else: dist = 0
End If
Next k
Next j
Next i
Worksheets("工作表2").Cells(i, 1) = x
Worksheets("工作表2").Cells(j, 2) = y
Worksheets("工作表2").Cells(k, 3) = dist
Worksheets("工作表2").Cells(1, 4) = WorksheetFunction.Average([C1:C100])
End Sub
作者: wenyonba (射後不理很XX啊!!!!)   2015-03-24 20:11:00
你的x,y,dist賦值,又沒有寫進Loop裡面...
作者: markbaseball (Mark)   2015-03-24 20:23:00
那該怎麼改寫呢
作者: MOONRAKER (㊣牛鶴鰻毛人)   2015-03-24 22:28:00
沒有寫進去,當然就寫進去啊
作者: Yaiba (緋心刀刃)   2015-03-26 15:10:00
把Worksheets("工作表2").Cells(i, 1) = x 到dist三行搬到NEXT K 上面不過看起來程式錯很大...
作者: lin0919 (無聊)   2015-03-27 13:09:00
這怎會是求圓周率的方式?
作者: MOONRAKER (㊣牛鶴鰻毛人)   2015-03-27 16:10:00
沒錯阿,畫一個邊長2的方格,裡面中間畫一個半徑1的內切圓,然後對裡面一直丟銅板。如果你丟的銅板夠多,最後圓內銅板數/方格內銅板總數就會等於pi/4不過看來他的程式中間就歪了 所以看起來不像
作者: Yaiba (緋心刀刃)   2015-03-27 19:27:00
嗯 我也是寫了一個程式證實是對的 滿有趣的
作者: lin0919 (無聊)   2015-03-27 23:39:00
他的寫法適 邊長一 裡面中間畫個半徑0.5的內切圓然後丟硬幣 應該如果在圓內dist=1 部在圓內dist=0然後再把dist加種起來平均*4我重寫過就能求出3.14
作者: MOONRAKER (㊣牛鶴鰻毛人)   2015-03-28 01:58:00
你這樣應該會得到4pi。Sorry,算錯了。
作者: wenyonba (射後不理很XX啊!!!!)   2015-03-29 10:34:00
這個方法挺有趣的,我從前也不知道,不過剛剛寫了VB試了一下,Rnd()一千萬次,3.14156xxxx,似乎精度普普 XD不過一千萬確實對這種數值方法來說,也沒多大就是了~~經由原Po學了點東西,很不賴~~
作者: Marty (DNA探針)   2015-03-30 10:20:00
Rand() 10萬次之後精度進展得很慢
作者: Yaiba (緋心刀刃)   2015-03-30 16:20:00
機率這種東西 本來就沒有準度 有準度就去賭場發財了...只能說可以得到一個大約的數字 要精準是不可能的...
作者: MOONRAKER (㊣牛鶴鰻毛人)   2015-03-31 10:10:00
只是大數定理的一個展示而已,實用性不大。

Links booklink

Contact Us: admin [ a t ] ucptt.com