(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次时多次运行后找一个中位数
5000次时多次运行后找一个中位数
10000次时多次运行后找一个中位数
(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次时多次运行后找一个中位数
5000次时多次运行后找一个中位数
10000次时多次运行后找一个中位数
(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次时多次运行后找一个中位数
5000次时多次运行后找一个中位数
10000次时多次运行后找一个中位数

方法 1000次 5000次 10000次
巴福昂投针 3.33 3.27 3.26
布丰投针 2.86 2.84 2.82
随机整数互素法 3.17 3.14 3.13
算法效率及解的精度分析 第三种方法计算出的pi值最接近真实值
另两种误差都极大
关键技术 算法的设计
启发与心得 通过取大量随机数,利用概率,有时是解决不确定性算法的好途径。