//随机化算法 用随机投点法计算定积分
#include<stdio.h>
#include<math.h>
#include<time.h>//使用当前时钟做种子
double Darts(int n,double a,double b);
double f(double x);//积分函数
main(){
int i,n[5]={100,1000,1000,10000,10000000};//随机投点个数,个数越多结果越精确
double a=1.0,b=2.0;//积分上下界
srand((unsigned)time(NULL)); //初始化随机数
for(i=0;i<5;i++)
printf("%d:\tn=%d\tr=%lf\n",i+1,n[i],Darts(n[i],a,b));
}
/* 基本思想是在矩形区域内随机均匀投点,求出由这些点
* 产生的函数值的算术平均值,再乘以区间宽度,即可得
* 出定积分的近似解
*/
double Darts(int n,double a,double b)
{
int i;
double sum = 0.0;
for(i=0; i<n; i++){
double x = (b-a)*rand() + a;//产生[a,b)之间的随机数
sum = sum + f(x);
}
return (b-a)*sum/n;
}
double f(double x){
return sin(x)/x;
}