蒙特卡罗方法计算圆周率C语言,用蒙特卡罗方法计算圆周率

(1)巴福昂投针:投针总次数n分别取1000、5000和10000

#include

#include

#include

#include

int main ()

{

int i;

float m=0,x,y;

srand(time(NULL));

for (i=1;i<=1000;i++)

{

x=rand()%10001/10000.0;

y=rand()%10001/10000.0;

if (sqrt(x*x+y*y)<=1)

m=m+1;

}

printf("pi=%f",(m/(i-1))*4);

}

运行结果

1000次时多次运行后找一个中位数

f974fb431e48881f2412e5473b7c2bd3.png

5000次时多次运行后找一个中位数

278c02e85c110969bd1c10dab9ac0813.png

10000次时多次运行后找一个中位数

f967087b757abc004a8b67db4f7ffc47.png

(2)布丰投针:投针总次数n分别取1000、5000和10000

#include

#include

#include

#include

int main()

{

float i,m=0;

double x,y;

srand(time(NULL));

for (i=1;i<=1000;i++)

{

x=rand()%10001/5000.0;

y=rand()%31416/10000.0;

if (x<=sin(y))

m=m+1;

}

printf("%lf %lf",i,m);

printf("pi=%lf",(i-1)/m);

}

注:xy取随机数时位数相同才能接近真实pi值

否则随机数取的概率和真实不符,数据差异极大

运行结果

1000次时多次运行后找一个中位数

9ef9444b6ebfb0f22837760081949d9c.png

5000次时多次运行后找一个中位数

ef4fca7bfd1e39eb15817a20330874b2.png

10000次时多次运行后找一个中位数

18a2535c6b63d5034f619229799de928.png

(3)随机整数互素:N取2^16-1次数n分别取1000、5000和10000

#include

#include

#include

#include

int maxcom (int x,int y)

{

int t;

t=x;

if(y

if (t==0)

{

printf("输入有误");

return t;

}

for(t;t>=1;t--)

{if(x%t==0&&y%t==0)return t;

}

}

int main()

{

int i;

int m=0,a,b,N=pow(2,16)-1;

srand(time(NULL));

for(i=1;i<=1000;i++)

{

a=rand()%N+1;

b=rand()%N+1;

if (maxcom(a,b)==1)m+=1;

}

printf("pi=%lf",sqrt(6*(double)i/m));

}

运行结果

1000次时多次运行后找一个中位数

7b878ea5bef2dfa45af230bacb5939b1.png

5000次时多次运行后找一个中位数

e09ea2e1a2ae290edf22fad60d51d71b.png

10000次时多次运行后找一个中位数

![图片描述](https://dn-

simplecloud.shiyanlou.com/uid/314777/1479459867902.png-wm)

方法 1000次 5000次 10000次

巴福昂投针 3.33 3.27 3.26

布丰投针 2.86 2.84 2.82

随机整数互素法 3.17 3.14 3.13

算法效率及解的精度分析 第三种方法计算出的pi值最接近真实值

另两种误差都极大

关键技术 算法的设计

启发与心得 通过取大量随机数,利用概率,有时是解决不确定性算法的好途径。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值