Python:每日一题 56

2017-11-27 13:44:00
六月
来源:
http://bbs.fishc.com/thread-87985-1-1.html
转贴 492
对于今天的题目,我原本只想写这样一句。
利用蒙特卡洛算法,计算pi.

但想想估计这样很多人都不知道从哪里开始,所以我把步骤稍微分解下。
先介绍下,如何根据蒙特卡洛算法来算出pi的。
基本思想: 利用圆与其外接正方形面积之比为pi/4的关系,通过产生大量均匀分布的二维点,计算落在单位圆和单位正方形的数量之比再乘以4便得到pi的近似值。样本点越多,计算出的数据将会越接近真识的pi(前提时样本是“真正的”随机分布)。

步骤:
1、产生一定数量的位于正方形内部的样本(样本越大越精确)。
2、计算样本中位于圆内的样本数量。
3、利用圆与其外接正方形面积之比为pi/4的关系,计算出pi值
4、和真实的pi值进行对比,获得误差。

网上已经有一些二维的例子,当然你也可以参考。

如果觉得练习不够,还可以试试下面这个三维的球体外接正方体计算pi,道理和步骤都是相似的。


冬雪给了个二维版的,我就给这个三维版的吧。



  1. import random

  2. def mCarlo3D_pi_1(lst):
  3.     import math
  4.     amount = len(lst)
  5.     r = 0
  6.     for each in lst:
  7.         if max(map(abs, each)) > r:
  8.             r = max(map(abs, each))
  9.     contain = 0
  10.     for each in lst:
  11.         x, y, z = each
  12.         if (x ** 2 + y ** 2 + z ** 2) ** 0.5 <= r:
  13.             contain += 1
  14.     mypi = 6 * contain / amount
  15.     rel = abs(math.pi - mypi) / math.pi
  16.     if rel >= 0.05:
  17.         result = False
  18.     else:
  19.         result = True
  20.     return [amount, r, contain, round(mypi, 4), str(round(rel * 100, 2)) + '%', result]

  21. lst = [(random.uniform(-1,1), random.uniform(-1,1),random.uniform(-1,1)) for _ in range(1000000)]
  22. print(mCarlo3D_pi_1(lst))
发表评论
评论通过审核后显示。