使用蒙特卡罗查找PI数字

时间:2009-06-11 17:10:29

标签: python statistics montecarlo pi

我尝试过很多使用蒙特卡罗寻找π的算法。 其中一个解决方案(在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

令人遗憾的是,即使有100万,精度也非常差( 3.141 ...... )。

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

3 个答案:

答案 0 :(得分:14)

这是蒙特卡洛的典型例子。但是,如果你试图将pi的计算分解为并行部分,为什么不使用无限系列并让每个核心取一个范围,然后在你去的时候对结果求和?

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

答案 1 :(得分:8)

您的小数误差超过sqrt(N)/N = 1/sqrt(N),因此这是获得精确估算的一种非常低效的方法。此限制由测量的统计性质决定,不能被打败。

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

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

答案 2 :(得分:4)

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