从飞镖投掷到 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。
大家熟悉的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。