蒙特卡罗算法入门

基本思想

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

求圆周率



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

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

# -*- coding:UTF-8 -*-
import random
import math
print '请输入迭代的次数:'
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 += 1
pi = 4.0 * total / n  # 得到Pi值
print '迭代次数是', n
print 'Pi的值是:', pi
print '标准数学pi是:', math.pi
print '误差是:', abs(math.pi - pi) / math.pi  # 计算误差
这段代码十分容易理解,这里把面积缩小为整圆的1/4

求定积分与自然数e


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值