前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蒙特卡洛法

蒙特卡洛法

作者头像
算法与编程之美
发布2024-06-07 19:04:25
630
发布2024-06-07 19:04:25
举报

1 问题

蒙特卡罗方法也成统计模拟方法,是指使用随机数(或者更常见的伪随机数)来解决很多计算问题的方法。工作原理就是两件事:不断抽样、逐渐逼近。如何利用python语言实现蒙特卡洛方法。

使用蒙特卡洛方法求出曲线y=x*x与x轴之间在0-1范围内的面积(种子数为10 使用100000个点进行计算),最后结果保留3位小数。

使用蒙特卡洛实现圆周率值的求解:有一个半径为r=1的圆和边长为1的正方形,圆的面积为 π ,则正方形内部的相切圆的面积为整个圆的1/4,也就是 1/4π ,正方形的面积为1。然后我们向正方形中随机打点,就会有一定的概率落在圆中,这样我们就可以得到落在圆中的概率就是=圆的面积/正方形面积,那么就可以推出圆周率的计算公式:红色点数/总点数

2 方法

  1. 首先通过random随机数的生成给变量赋值
  2. 分别列出种子数,点数等值
  3. 通过for i循环的方法对x与y进行多次的随机数赋值
  4. 进行曲线与x轴的判断使得求得是在0-1范围内的值
  5. 最后输出一个比例并保留3位小数

通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。

  1. 引入随机数模块
  2. 进行随机点数的赋值
  3. 运用循环的方法进行t次循环对x与y的随机数赋值
  4. 进行值判断
  5. 最后输出当点数不同时圆周率π的值

通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。

代码清单 1

代码语言:txt
复制
#1.求面积
import random as rd
rd.seed(10)
total=100000
cnt=0
for i in range(1,100000+1):
   x=rd.random()
   y=rd.random()
   if x**2>=y:
       cnt+=1
print(f'{cnt/total:.3f}')
#2.求解圆周率π值
import random
total=[10,100,1000,10000,100000,1000000,50000000]#随机点数
for t in total:
             in_count=0
             for i in range(t):
                 x=random.random()
                 y=random.random()
                 dis=(x**2+y**2)**0.5
                 if dis<=1:
                     in_count+=1
             print(t,'个随机点时,π是:',4*in_count/t)

3 结语

针对实现蒙特卡洛方法,主要运用了随机数生成与循环for一句,通过上面实验,证明该方法是有效的,本文的方法存在需要注意的第一种问题需注意随机数对种子数赋值的方法,虽然是细节,但也应该注意,第二种方法也同样,也主要运用了随机数赋值方法。两种方法原理不是很深,在以后的学习中还可以向深处挖掘以及进行代码的简化,任重而道远。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档