算法——随机化算法~计算圆周率的近似值

题目:
下面介绍一个用随机投点法计算圆周率的近似值的算法,利用圆与其外切正方形的面积之比来计算π的近似值。
题解思路:
半径为1的圆的1/4是一个扇形,是边长为1的正方形的一部分。k=πrr/4/rr=π/4;可得π=4k。这里用随机投点法来计算K的近似值,从而得到π的近似值。在正方形中投掷n个点,每个点落在正方形中每个位置的机会均等,然后记录有多少点落在正方形内,其中落在扇形内的点的个数m与总数n的比值就是k的近似值。
编程模拟在正方形内随机投点可用如下方法:
x=(double)rand()/RAND_MAX;
y=(double)rand()/RAND_MAX;
因为rand()函数产生的随机数范围是0~32767,RAND_MAX代表最大随机数32767,故0<=x<=1,0<=y<=1,点(x,y)正好落在正方形内。当xx+yy<=1时点(x,y)落在扇形区域内,我们只需要统计总共生成的点数n和落在扇形内的点数m就可求出π:π约等于4*m/n.
代码:

#include
#include
#include
#include
double frandom();
int main()
{
    double x,y,p;
    int i,count,n;
    srand((unsigned int)time(NULL));//设置种子
    scanf("%d",&n);//输入投点总次数
    count=0;
    for(int i=1;i<=n;i++)
    {
        x=frandom();
        y=frandom();
        if(sqrt(x*x+y*y)<=1)//若点位于扇形内
        {
            count++;
        }
    }
    p=4.0*count/n;//计算π的近似值
    printf("%.4f",p);//输出π的近似值
    return 0;
}
//生成0~1之间的随机数
double frandom()
{
    srand(time(NULL));
    return (double)rand()/RAND_MAX;
}

注意:
rand函数用来产生0~32767的随机数,srand()用来设置rand()产生随机数时的随机数种子。在调用rand()函数前,如果没有用srand()函数设置随机数种子,随机数种子将自动设成相同值1,这将导致rand()所产生的随机数值都一样。所以一般调用rand()函数前先利用srand()设好随机数种子。通常可以利用time(NULL)的返回值做种子,time(NULL)的返回值是国际标准时间公元1970年1月1日00:00:00以来经历的秒数。使用time函数,要包含头文件 time.h

你可能感兴趣的:(算法)