[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