从飞镖投掷到 SPHERICAL 飞镖盘中估算圆周率 (python)

Estimating pi from darts being thrown at a SPHERICAL dartboard (python)

大家熟悉的pi估算代码如下:

import math,random
random.seed(777)
j = pie = 1
while True:
    pie = pie + math.trunc(random.random()**2 + random.random()**2)
    if j%100000==0: print(4*(1-float(pie)/float(j)))
    j = j + 1
print('done')

模拟向二维飞镖靶投掷飞镖。 但是当你尝试提升到三维飞镖时:

import math,random
random.seed(777)
j = pie = 1
while True:
    pie = pie + math.trunc(random.random()**2 + random.random()**2 + random.random()**2)
    if j%100000==0: print((3.0/4.0)*8.0*(1-float(pie)/float(j)))
    j = j + 1
print('done')

你得到的不是圆周率。

总的来说,我同意@Bob__提出的解决方案,因为它更直接。 话虽如此,您的解决方案可以推广到 3 维飞镖:

import math,random

random.seed(777)
j = pie = 1
pie = 0
while True:
    # pie = pie + math.trunc(random.random()**2 + random.random()**2 + random.random()**2)
    pie = pie + min(1, math.trunc(random.random()**2 + random.random()**2 + random.random()**2))
    if j%100000==0: print((3.0/4.0)*8.0*(1-float(pie)/float(j)))
    j = j + 1
print('done')

要理解这个问题,我们需要弄清楚 pie 变量的真正作用。它包含随机半径大于 1.0(因此超出 3D 飞镖板)的情况数。

2D 案例有效,因为 math.trunc 总是 returns 0 或 1(进或出)但对于 3D 它 returns 0 或 1 或 2。所以,以防万一对于 3D,它会失败,因为它有时会将 pie 增加 2,因此收敛得更快。

要修复您的示例,您只需要确保 pie 一次不会增加超过 1。