4

我尝试了许多算法来使用蒙特卡洛找到 π。解决方案之一(在 Python 中)是这样的:

def calc_PI():
    n_points = 1000000
    hits = 0

    for i in range(1, n_points):
        x, y = uniform(0.0, 1.0), uniform(0.0, 1.0)

        if (x**2 + y**2) <= 1.0:
            hits += 1

    print "Calc2: PI result", 4.0 * float(hits) / n_points

可悲的是,即使有 1000000000,精度也非常差(3.141...)。

这是该方法可以提供的最大精度吗?我选择蒙特卡洛的原因是它很容易在平行部分中分解。是否有另一种易于分解和计算的 π 算法?

4

3 回答 3

14

这是蒙特卡洛的经典例子。但是,如果您试图将 pi 的计算分解为并行部分,为什么不使用无限级数并让每个核心取一个范围,然后将结果求和?

http://mathworld.wolfram.com/PiFormulas.html

于 2009-06-11T17:26:25.830 回答
8

你的分数误差过去了sqrt(N)/N = 1/sqrt(N),所以这是一种非常低效的精确估计方法。这个限制是由测量的统计性质设定的,不能被超越。

您应该能够获得floor(log_10(N))/2-1准确的N投掷数字。也许-2只是为了安全...

即便如此,它也假设您使用的是真正的 RNG 或足够好的 PRNG。

于 2009-06-11T17:18:03.570 回答
4

使用准随机数生成器 ( http://www.nag.co.uk/IndustryArticles/introduction_to_quasi_random_numbers.pdf ) 而不是标准的伪 RNG。准随机数比伪随机数更均匀地覆盖积分区域(您正在做的是 MC 积分),从而提供更好的收敛性。

于 2009-06-12T12:25:04.750 回答