用C语言实现布丰投针计算圆周率问题

今天遇到一个布丰投针的问题,要用编程来实现,我就看着关于布丰投针的说明和简化公式,提炼出了需要的地方
1. 针长为二分之一平行线之间间距的时候结果最为接近
2. 圆周率等于二倍的针长比上平行线间距与概率的积
3. 针的中心点到最近的平行线的距离小于针与平行线之间夹角的正弦乘以针长的一半,则代表针与平行线相交
4. 针与平行线相交的个数比上总投针的个数就可以得到概率
(因为本人数学实在渣到令人发指,所以还是依靠友人的数学能力才将某些部分弄对)


接下来就是需要利用C代码来实现的需求:
1. 输入投针次数
2. 输出圆周率

代码中的逻辑就是输入投针次数,模拟一遍投针实验,然后得到概率,将概率带入计算圆周率的公式,最后输出圆周率


(因为有时候看贴在这里的代码有时不是很方便,所以我截了图,因为之前遇到过整形的相除出现问题的情况所以我在运算中都加了强转,大神看到千万不要嘲笑小的,毕竟我胆小)

(在C中 sin函数的参数是弧度,而我随机产生的是夹角的角度,因为还要将角度转换成弧度进行计算)

(平行线的间距修改成其他值最后输出的结果也是3.0到3.3之间,所以我觉得也许大概可能就是这样的逻辑了吧,如果有哪位大佬能写出对的投针代码,教教我吧T_T)

首先是引入头文件和定义平行线间距跟针长以及要用到的两个函数
定义头

其次就是模拟实验的函数
模拟投针实验

最后是求圆周率的公式
求圆周率公式

然后在主函数中进行输入输出就好了

附:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define A 100
#define L (A / 2)

double P(int n);
double get_pi(int n);

int main()
{
    int num;
    printf("输入要投的针数:");
    scanf("%d", &num);
    printf("pi = %lf\n", get_pi(num));
    return 0;
}

double P(int n)
{
    double p;
    float distance, angle;
    int   i, count = 0;
    srand(time(NULL));
    for(i = 0; i < n; i++)
    {
        distance = rand() % (L + 1);
        angle    = rand() % 91;
        if(distance < (sin(angle * M_PI / 180) * (L / 2)))
        {
            count++;
        }
    }
    p = (double)count / (double)n;
    return p;
}

double get_pi(int n)
{
    return 2.0 * (double)L / ((double)A * P(n));
}

猜你喜欢

转载自blog.csdn.net/qq_31284831/article/details/78358443