欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

两个人在校园相遇的概率是多少?(C语言)

程序员文章站 2022-03-04 20:00:40
...

问题描述

连着好几天,和一个同学在校园相遇,刚才在来自习的路上又遇到了,于是决定编程计算一下相遇的概率。正好使用一下随机数。
模型十分简单(不喜勿吐槽):设考虑区域为正方形,随机生成两个(三维)坐标,第一维是出现时间,若时间小于某值则判断距离,否则认为不相遇;二三维为位置坐标,如果距离小于一个值就认为相遇。将过程重复若干次,用“相遇”次数除以总的模拟次数,得到的频率近似来代替概率。
编译环境:DEV-CPP

代码

/*************************************
 * Name:1999(Probability of meeting) *
 * Version:1.0                       * 
 * Accomplished date: 2019.12.25     *
 * Claim: All rights reserved        *
 *************************************/
#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int main()
{
//jia,yi 甲乙两个数组,各有三个数,第一个数记录出现在区域的时间
	double jia[3],yi[3];
//N为模拟总次数;d为临界距离,小于d即认为相遇;t为临界时间,只有两者时间差小于临界时间才判断两者的距离;L为区域边长(考虑区域为正方形)
	double i,N=2222222,z,P,Pa,y=1,d=8,dist,dt,t=1;
	int L=600,T=12;
//c为判断变量,若为‘y’则再计算一遍,每次结果会稍有偏差
	char c='y';
	printf("Total Sample: %.0f\n\n",N);
	while(c=='y')
	{
		srand((unsigned int)time(0));
		for(i=0,z=0;i<N;i++)
		{
			//出现时间
			jia[0]=rand()%T+1;
			yi[0]=rand()%T+1;
			dt=abs(jia[0]-yi[0]);
			if(dt<=t)
			//如果小于临界时间dt则生成两者位置
			{
				jia[2]=rand()%L+1;
				yi[3]=rand()%L+1;
				jia[3]=rand()%L+1;
				yi[2]=rand()%L+1;
				//计算距离dist,若小于临界值d,z计数
				dist=sqrt(pow(jia[2]-yi[2],2)+pow(jia[3]-yi[3],2));
				if(dist<=d) z=z+1;
			}
		}
		//计算模拟一次的概率
		P=z/N;
		Pa=Pa+P;
		printf("Meet: %.0f\nProbability: %.5f %%\n",z,P*100);
		printf("Calculate again?(y/n)\n\n");
		c=getch();
		//y为计数变量,模拟一次则加一,便于最后计算平均概率
		if(c=='y') y++;
	}
	//Pa为平均概率
	Pa=Pa/y;
	printf("Average: %.5f %%\n\n",Pa*100);
	system("pause");
}

运行结果

两个人在校园相遇的概率是多少?(C语言)

后记

模型十分简单,还有丰富、更合理地空间。
当做随机数的资料吧,以后还需要的话翻出来看看。
是c语言入门练手、熟悉基本函数、功能的好实例。
该系列自“1997”以来,这是第三款程序。功能分别为:
“1997”初学c语言大作业(2016.6.19);
“1998”实现信任的进化部分功能(2017.10.30);
“1999”模拟人和人的相遇,计算相遇概率(2019.12.25)。

相关标签: c语言