两个人在校园相遇的概率是多少?(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语言入门练手、熟悉基本函数、功能的好实例。
该系列自“1997”以来,这是第三款程序。功能分别为:
“1997”初学c语言大作业(2016.6.19);
“1998”实现信任的进化部分功能(2017.10.30);
“1999”模拟人和人的相遇,计算相遇概率(2019.12.25)。
上一篇: redis 6 通信协议RESP
下一篇: Redis中切换db
推荐阅读