蒲丰投针问题

布丰实验

			法国数学家布丰(1707-1788)最早设计了投针试验。

这一方法的步骤是:
1) 取一张白纸,在上面画上许多条间距为a的平行线。
2) 取一根长度为l(l≤a) 的针,随机地向画有平行直线的纸上掷n次,观察针与直线相交的次数,记为m。
3)计算针与直线相交的概率.
18世纪,法国数学家布丰提出的“投针问题”,记载于布丰1777年出版的著作中:“在平面上画有一组间距为a的平行线,将一根长度为l(l≤a)的针任意掷在这个平面上,求此针与平行线中任一条相交的概率。”
布丰本人证明了,这个概率是:
(其中π为圆周率)!在这里插入图片描述
布丰惊奇地发现:有利的扔出与不利的扔出两者次数的比,是一个包含π的表示式.如果针的长度等于a/2,那么扔出的概率为1/π.扔的次数越多,由此能求出越为精确的π的值。
认真学过概率论的都知道这个实验是有理论依据的,换句话说理论上它确实可以求出π的近似值,只要重复实验的次数足够多,误差就会足够小!
在这里插入图片描述
我相信如果用计算机大量重复模拟这次实验的话,一定会得到更好的结果.
在这里插入图片描述

首先有一个随机生成角度的代码.模拟这跟针每次落下后的与水平方向上的随机的夹角.
在这里插入图片描述
然后实现让这根针随机落在平面上.在这里插入图片描述
用两随机点(A,B)确定这一跟针的位置.(随机点A负责确定针中心的位置),随机点B随机出现在以A为圆心的半径为L/4的园内.将两者确定的直线的斜率记录下来,利用公式画出该直线.

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <cmath>
#include <graphics.h>
#include<conio.h>
#include <windows.h>
#include <stdio.h>

int main()
{

	initgraph(1000, 1000);					//建立窗口

	line(0, 0, 1000, 0);					//划线
	line(0, 200, 1000, 200);				//划线
	line(0, 400, 1000, 400);				//划线
	line(0, 600, 1000, 600);				//划线
	line(0, 800, 1000, 800);				//划线
	line(0, 1000, 1000, 1000);				//划线

	double l = 50;

	srand(time(NULL));					//在计算机随机数列中找到一个与该时刻有关的点

	double p = 1, c1 = 0, c2 = 0;

	int count = 10000;


	while (count--)
	{
		double x0, y0;
		x0 = rand() % 1001;
		y0 = rand() % 1001;
		double x1, y1;
		x1 = x0 + rand() % 101 - 50;
		y1 = y0 + rand() % 101 - 50;
		if ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0) > 2500)
			continue;

		double m = atan((y1 - y0) / (x1 - x0));
		line(x0 - l * cos(m), y0 - l * sin(m), x0 + l * cos(m), y0 + l * sin(m));

		c2++;

		double b1 = y0 - l * sin(m), b2 = y0 + l * sin(m);
		if (b1 < b2)
		{
			if (0 >= b1 && 0 <= b2)
				++c1;
			else if (200 >= b1 && 200 <= b2)
				++c1;
			else if (400 >= b1 && 400 <= b2)
				++c1;
			else if (600 >= b1 && 600 <= b2)
				++c1;
			else if (800 >= b1 && 800 <= b2)
				++c1;
			else if (1000 >= b1 && 1000 <= b2)
				++c1;
		}
		else
		{
			if (0 >= b2 && 0 <= b1)
				++c1;
			else if (200 >= b2 && 200 <= b1)
				++c1;
			else if (400 >= b2 && 400 <= b1)
				++c1;
			else if (600 >= b2 && 600 <= b1)
				++c1;
			else if (800 >= b2 && 800 <= b1)
				++c1;
			else if (1000 >= b2 && 1000 <= b1)
				++c1;
		}

		p = c2 / c1;
		int P = p*100000;
		char s[16] = {0};
		_itoa_s(P,s,10);
		size_t len = strlen(s) + 1;

		size_t converted = 0;

		wchar_t* WStr;

		WStr = (wchar_t*)malloc(len * sizeof(wchar_t));

		mbstowcs_s(&converted, WStr, len, s, _TRUNCATE);

		clearrectangle(125, 180, 200, 200);
		Sleep(1);
		outtextxy(125, 180, WStr);
	}
	std::cout << p << std::endl
		<< c1 << std::endl
		<< c2 << std::endl;
	return 0;
}`
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210408145704106.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21wd1lhZ2FtZQ==,size_16,color_FFFFFF,t_70)


仅精确到了小数点后一位...,考虑到C++的随机是伪随机,或许可以"体谅"一下.不过,个人觉得文章开头部分列出的科学家们的实验结果有待考察正确与否!
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 【2】项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 【3】项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 【4】如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能,欢迎交流学习。 【注意】 项目下载解压后,项目名字和项目路径不要用中文,否则可能会出现解析不了的错误,建议解压重命名为英文名字后再运行!有问题私信沟通,祝顺利! 基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip 基于联邦学习和深度残差网络实现的网络入侵检测python源码+实验说明.zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值