蒙特卡罗算法入门

来源:互联网 发布:时间轴软件 编辑:程序博客网 时间:2024/06/06 19:21

基本思想

当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。

求圆周率



上面的两张图来自阮一峰的网络日志,深表感谢!

相信都能理解上面公式的含义,在半径相同的条件下,圆的面积和正方形的面积存在固定的比例关系,这个关系就是pi/4

# -*- coding:UTF-8 -*-import randomimport mathprint '请输入迭代的次数:'n = int(raw_input())  # n是随机的次数total = 0  # total是所有落入圆内的随机点for i in xrange(n):    x = random.random()    y = random.random()    if math.sqrt(x ** 2 + y ** 2) < 1.0:  # 判断是否落入圆内        total += 1pi = 4.0 * total / n  # 得到Pi值print '迭代次数是', nprint 'Pi的值是:', piprint '标准数学pi是:', math.piprint '误差是:', abs(math.pi - pi) / math.pi  # 计算误差
这段代码十分容易理解,这里把面积缩小为整圆的1/4

求定积分与自然数e


在上图里,整个正方形的面积是1,红色部分表示积分函数的面积。我们很容易理解,随机数落在红色区域的概率和落在正方形区域的概率的壁纸就可以表示该定积分的值

# -*- coding:UTF-8 -*-import randomprint '请输入迭代的次数:'n = int(raw_input())total = 0for i in xrange(n):    x = random.random()    y = random.random()    if x*x  > y:        total += 1integrate = 1.0*total / nprint '迭代次数是', nprint '积分的结果是:', integrate
关于自然数e的计算,因为暂时还不会插入公式,这里先给出代码,随后把图和公式补上

# -*- coding:UTF-8 -*-import randomprint '请输入迭代的次数:'n = int(raw_input())total = 0for i in xrange(n):    x = random.uniform(1, 2)    y = random.uniform(0, 1)    if 1/x > y:        total += 1rate = n*1.0/totalprint '迭代次数是', nprint rateprint '积分的结果是:', 2**rate
0 0