C语言/C++用投针法计算圆周率

在边长为1的正方形内部,以正方形的中心为圆心画一半径为r的圆。在正方形内进行次随机投针试验,假定其中落在圆内的针的数目为n0,则可得到n/n0=πr^2,由此可计算π的值。

n0固定,研究π的计算精度和r之间的关系,可计算π对变化的灵敏度,即从某固定值增加或减少某个小的量时,对应π的值是否有明显变化;
* 研究π计算精度和n0之间的关系时,可固定r,计算n0取不同值时π计算精度的均值和方差。
设计并测试一个用于计算圆周率PI的正方形类PISquare。要求:
(1) 在PISquare类外定义名为Point的结构体,其成员为 double x 和 double y , 用于保存一个点的坐标;
(2) 定义PISquare的类成员变量:总点数,圆半径,落入圆内的点数,最终所计算的值PIVal等;
(3) 定义PISquare的数组成员变量:Point pts[ N ], 用于保存所有个点的坐标(N为预设的大的常量,如30000);
(4) 定义PISquare的成员函数FillPoints (),用于将[0,1]*[0,1]内产生的个随机点填入pts的前个元素;
(5) 定义PISquare的private成员函数int CacuInPoints (),用于统计落入半径为的圆内的点数;
(6) 定义PISquare的成员函数CacuPI(),用于计算圆半径为时的值。需要调用CacuInPoints 函数;
(7) 定义PISquare的成员函数ShowRes(),用于显示,以及圆半径为时的值。
(8) 定义PISquare的构造函数,完成:
8.1 数组pts的所有N 个点设初值(0, 0);
8.2 设置和的值;
8.3 产生单位元内的个随机点,作为数组pts的前个元素;

代码如下:

#include <iostream> 

#include <fstream>
#include <math.h>

using namespace std;

double randx,randnum;

unsigned long randi=1;

const unsigned long randa=16807;

unsigned long randm=pow(2,31)-1;
const double pi=3.1415926;

// random number creation

void random_number()

{

 if ( randi == randm )

 {

   randi=randm-1;

 }

 randi=(randa*randi)%randm;

 randx=randi;

 randnum=randx/randm;

 return ;

}

// program main

void main(void)

{

 FILE *fp9;

 fp9=fopen("mypi.dat","w+");

 double jianju;
 double zhenchang;
 double minjuli;
 double hudu;
 double shiyanpi; 
 int cishu;
 int i;
 int j=0;
cout<<"请输入投针次数"<<"\n";
cin>>cishu;
cout<<"请输入平行线间距"<<"\n";
cin>>jianju;
cout<<"请输入针的长度"<<"\n";
cin>>zhenchang;

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

 {

   random_number();
  minjuli=randnum*jianju/2;
  random_number();
  hudu=randnum*pi;
   if(minjuli<=zhenchang/2*sin(hudu))
       j++;

 shiyanpi=2*zhenchang*i/(jianju*j);
   if(i%1000==0)
      fprintf(fp9,"%d%15.6f   \n",i,shiyanpi);
}

}

希望能帮到你!望采纳!

追问

你这个不符合我的要求啊,算法不符合,而且没有定义类。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-02
你这个太明目张胆了吧。
相似回答