实验报告课程名称 道路交通系统仿真 学生姓名 学 号 专业班级 指导教师 院系名称 交通运送工程学院 2023 年 11 月 10 日实验一 随机数生成程序一. 实验规定产生1~1000的随机数,个数大约256个二. 实验环境工具使用Visual C++ 6.0,程序类型 Win32 Console Application三. 实验原理根据公式x[i]=a*x[i-1]mod(m),可根据所需范围值拟定a和m的值,本实验中需要1~1000的随机数,因此可以选择a=35,m=1024其周期为(m/4)=256,产生256个1~1024之间随机数根据需要,我们舍弃大于1000的随机数,原理是我们使用中间变量连接产生的数与我们需要的数组,通过对中间变量的不断循环,当产生大于1000的随机数时,我们继续使中间变量不断循环但不放入数组,从而舍弃这些数字,最终得到我们需要的1~1000的随机数的数组并输出数组中的数,并计数其个数,这样就完毕了我们的产生随机数的目的。
四. 实验环节图一 随机数程序流程图 图二 随机数程序运营结果程序开始先给定初始值(1~1000以内奇数),根据给定的公式计算中间值temp,再判断temp的值是否小于1000,把小于1000的temp值赋给数组x[i],循环执行该命令直至x[i]=x[0],结束程序并输出数组值和数组大小数组值随初始值改编而改变,初始值决定数组值的变化五. 分析总结由图二随机数程序运营结果可以看出,该程序运营结果与我们所给与的数学模型盼望达成的效果一致程序运营对的,伪随机数的周期为256个,由于去除了大于1000的随机数,故程序结果显示为249,与数学模型的周期一致附录#include void main(void){ int i=1,j=0,temp=0; int a=35,m=1024; int x[256]; int k; printf("输入到达服务时间随机初始值:"); scanf("%d",&x[0]); printf("\n"); while(i) { temp=a*x[i-1]%m; while(temp>1000) { temp=a*temp%m; } if(temp!=x[0]) { x[i]=temp; printf("%5d",x[i]); i++; } else {j=i-1,i=0;} } printf("\n\nj=%d\n\n",j);}实验二 单服务台排队系统仿真一. 实验规定单服务台对到达顾客进行服务,顾客单路排队,随机分派顾客的到达时间间隔和服务时间,从而拟定顾客的到达时刻和服务开始结束时刻,并计算服务台的空闲时间和顾客的排队等待时间。
通过程序实现对单服务台排队系统的仿真,根据程序运营结果计算重要结果属性值二. 实验环境工具使用Visual C++ 6.0,程序类型 Win32 Console Application三. 实验原理在程序设计中,顾客到达时间间隔time_interval和服务时间service_time由随机数拟定顾客到达时间间隔通过随机数分布并定义其分布区间,从而拟定其到达间隔时间;服务时间也是先通过随机数程序产生一组随机数,然后通过对随机数区间的定义拟定随机服务时间这两个参数拟定后可以通过数学方法拟定其他参数,因此到达时间间隔和服务时间是程序中最重要的两个参数四. 实验环节 图三 单服务台仿真流程图 图四 随机时间间隔 图五 随机服务时间图六 单服务台排队系统顾客服务时刻表程序先通过随机数方法分派排队顾客的随机到达时间间隔和随机服务时间随机到达时间间隔是用1~1000之间的随机数进行等概率分派给1~8分钟的到达间隔;随机服务时间是将1~1000的随机数分派给1~6分钟的服务时间,其分派时段根据概率0.1,0.2,0.35,0.2,0.1,0.05分派,通过这种方法将1~1000以内的随机数分派给各个时间段,从而得到顾客的随机到达时间间隔和随机服务时间。
得到这两个基本参数后,通过数学方法联系其他参数,运用程序的循环过程最终可以输出单服务台顾客服务时刻表五. 分析总结通过程序运营和结果校正,程序输出结果对的,程序运营对的我们以10个顾客为例,运营程序,可以计算出在该程序设定条件下的属性值:顾客平均等待时间=0.7 min服务员平均服务时间=3.4 min服务员平均空闲时间=1.2 min六. 附录#include int imax(int, int);void main(void){ int time_interval[256]; int reach_point[256]; int service_time[256]; int service_end_point[256]; int wait_time[256]; int free_time[256]; int x[256]; int y[256]; int n,max; int i=1,temp=0; int a=35,m=1024;/*输入顾客人数*/ printf("输入顾客数n: "); scanf("%d",&n);/*产生到达时间随机间隔*/ printf("\n输入到达时间间隔随机初始值(1~1000): "); scanf("%d",&x[0]); printf("\n"); while(i>=1) { temp=a*x[i-1]%m; while(temp>1000) { temp=a*temp%m; } if(temp!=x[0]) { x[i]=temp; i++; } else {i=0;} } for(i=1;i<=n;i++) { if(x[i]>=1&&x[i]<=125) time_interval[i]=1; if(x[i]>=126&&x[i]<=250) time_interval[i]=2; if(x[i]>=251&&x[i]<=375) time_interval[i]=3; if(x[i]>=376&&x[i]<=500) time_interval[i]=4; if(x[i]>=501&&x[i]<=625) time_interval[i]=5; if(x[i]>=626&&x[i]<=750) time_interval[i]=6; if(x[i]>=751&&x[i]<=875) time_interval[i]=7; if(x[i]>=876&&x[i]<=1000) time_interval[i]=8; } i=1; printf("第1位顾客到达时间间隔为: 0"); for(i=2;i<=n;i++) { printf("\n第%d位顾客的随机到达时间间隔位: %d",i,time_interval[i]); } printf("\n\n");/*产生随机服务时间*/ i=1,temp=0; a=35,m=1024; printf("\n输入到达服务时间随机初始值(1~1000): "); scanf("%d",&y[0]); printf("\n"); while(i>=1) { temp=a*y[i-1]%m; while(temp>1000) { temp=a*temp%m; } if(temp!=y[0]) { y[i]=temp; i++; } else {i=0;} } for(i=1;i<=n;i++) { if(y[i]>=1&&y[i]<=100) service_time[i]=1; if(y[i]>=101&&y[i]<=300) service_time[i]=2; if(y[i]>=301&&y[i]<=650) service_time[i]=3; if(y[i]>=651&&y[i]<=850) service_time[i]=4; if(y[i]>=851&&y[i]<=950) service_time[i]=5; if(y[i]>=951&&y[i]<=1000) service_time[i]=6; } for(i=1;i<=n;i++) { printf("\n第%d位顾客的随机服务时间:%d ",i,service_time[i]); } printf("\n\n\n");/*主程序排队序列开始,将第一人单独考虑,后面的连续分派间隔时间*/ time_interval[0]=0; reach_point[0]=0; service_time[0]=0; service_end_point[0]=0; wait_time[0]=0; free_time[0]=0; time_interval[1]=0; reach_point[1]=0; wait_time[1]=0; free_time[1]=0; service_end_point[1]=reach_point[1]+service_time[1]; printf("顾客号=1"); printf(" 到达时间间隔=%d",time_interval[1]); printf(" 到达时刻=%d",reach_point[1]); printf(" 服务时间=%d",service_time[1]); printf(" 服务结束时刻=%d",service_end_point[1]); printf(" 等待时间=%d。