模拟抽奖的c语言仿真
这是去年参加学校仿真大赛低年级组的论文计算机仿真论文:50人依次抽奖编程与仿真
摘要:近年来,各种抽奖活动层出不穷。由此,人们越来越多的寻求抽奖的捷径,抽奖顺序也一直被认定为影响中奖率的一大重要因素,很多人纠结于抽奖顺序而在抽奖前后表现出过分的沮丧并因此在一段时间内影响其心情甚至生活和工作。
我组此次“50人依次抽奖的编程与仿真”借助编程软件进行数量化模拟,运用多次防真、观察结果的方法,旨在探究中奖率与依次抽奖顺序的关系。
在编制仿真程序时,我组本着简单可行、真实模拟的原则完成仿真编程(所编程序见正文2.1)。此程序中主要包括随机函数、循环结构、判断语句及其他简单命令。
利用C语言编一个程序来实现随机数的抽取,从而达到我所需要的目的。
计算机仿真来将50人随机安排奖项,在运用C语言中的随机函数来保证随机的公平性当每个顾客依次抽奖,计算机随机安排一个数赋给顾客,而当顾客抽取到特定的数时,就会判断该数是否对应着相应的奖项,从而顾客随机产生奖项。
运行该程序,我们可以成功的来产生随机奖项。在抽奖中已经可以保证抽奖的公平,对于数已经可以随机产生并且没有重复,在抽奖中不在重复产生奖项。
通过对仿真结果和数学方法处理所得数据(典型结果见于附件表1,数据见于3.1)的研究,我组基本得出中奖率与依次抽奖顺序无关。
关键词:依次抽奖;编程与仿真;中奖率与抽奖顺序;多次模拟;分析数据
1.引言
此次我组选择“50人依次抽奖”作为研究题目,除考虑自身客观条件外,更重要的是我组认识到可以借助此次仿真模拟可以探讨“抽奖中奖率和依次抽奖时抽奖顺序的关系”这一实际问题。通过对当代实际问题的仿真与研究,可以实现计算机仿真的真实意义和价值,并通过此次研究成果来激励自身乃至更广大同学们对计算机仿真的兴趣。
2.程序介绍
2.1程序展示
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int num,gl,n=50;
int f1=1,f2=2;
int s1=3,s2=6;
int t1=7,t2=12;
time_t t;
srand((unsigned) time(&t));
for(num=1;num<=50;num++)
{
gl=rand()%(n-1+1)+1;
if(f1<=gl&&gl<=f2)
{printf("第%d位顾客获得一等奖\n",num);
f1=f1-1;f2=f2-1;
s1=s1-1;s2=s2-1;
t1=t1-1;t2=t2-1;}
else
if(s1<=gl&&gl<=s2)
{printf("第%d位顾客获得二等奖\n",num);
s1=s1-1;s2=s2-1;
t1=t1-1;t2=t2-1;}
else
if(t1<=gl&&gl<=t2)
{printf("第%d位顾客获得三等奖\n",num);
t1=t1-1;t2=t2-1;}
else
printf("第%d位顾客没有获奖\n",num);
n=n-1;
}
return 0;
}
2.2程序大体思路
为真实模拟50人依次抽奖,我组所做程序运行流程图。编号为1的顾客先进行抽奖,即时得出结果;随后编号为2的顾客进行抽奖……以此进行50次循环。
2.3程序解释
#include <stdio.h>
#include <stdlib.h>
#include <time.h> 此处为三个表头文件;
为使多次模拟时模拟结果不同,在随机函数中,我组采用时间作为种子。
int num,gl,n=50;
num为对抽奖者进行排序命名以便确认哪位顾客获奖;在本程序中,num由1递增至50
gl为判断顾客是否中奖的判断量(详情见下文)。
int f1=1,f2=2;
int s1=3,s2=6;
int t1=7,t2=12;
f、s、t分别为first、second、third缩写;
f1、f2定义为一等奖范围端点,初始长度为2;
s1、s2定义为二等奖范围端点,初始长度为4;
t1、t2定义为三等奖范围端点,初始长度为6。
time_t t;
srand((unsigned) time(&t));
在随机函数中设定时间为种子。
for(num=1;num<=50;num++)
{ ……
}
模拟50位顾客依次进行抽奖。
gl=rand()%(n-1+1)+1;
随机选取数字范围为1至n,
并将所得数字记录为gl;
n初始值为50,每有一位顾客抽完,n减少1
if(f1<=gl&&gl<=f2)
{printf("第%d位顾客获得一等奖\n",num);
f1=f1-1;f2=f2-1;
s1=s1-1;s2=s2-1;
t1=t1-1;t2=t2-1;}
如果随机数据gl在[f1,f2]内,
则输出“第某位顾客获得一等奖”;
输出结束后,因为已抽出一个一等奖,所以一等奖总数要减少1,这里通过左移区间范围来实现;
由于一等奖范围左移,随机数总范围减少,所以随后的二、三等奖范围也要左移。
(详细举例解释见2.4)
else
if(s1<=gl&&gl<=s2)
{printf("第%d位顾客获得二等奖\n",num);
s1=s1-1;s2=s2-1;
t1=t1-1;t2=t2-1;}
原理同上
else
if(t1<=gl&&gl<=t2)
{printf("第%d位顾客获得三等奖\n",num);
t1=t1-1;t2=t2-1;}
原理同上
else
printf("第%d位顾客没有获奖\n",num) 如果所得随机数字不在一、二、三等奖范围内,
则可判定为没有中奖
n=n-1; 实现每次抽奖结束后可抽奖券总数减少1
2.4程序核心部门举例解释
以判断是否获得一等奖为例。此时[f1,f2]为[1,2]、[S1,S2]为[3,6]
“ gl=rand()%(n-1+1)+1;
if(f1<=gl&&gl<=f2)
{printf("第%d位顾客获得一等奖\n",num);
f1=f1-1;f2=f2-1;
s1=s1-1;s2=s2-1;
t1=t1-1;t2=t2-1;} ”
例如gl随机得到2,经判断,输出“第1位顾客获得一等奖”,
随后[f1,f2]变为[0,1],[s1,s2]变为[2,5].
第二次gl再次随机得到2,再判断时,输出“第2位顾客获得二等奖”。
3.数据分析
3.1获得数据
我组在对所编程序进行多次运行检查后,开始对仿真结果进行数据统计。在数据统计阶段,我组共进行20次仿真,并分别将计算结果计入表格。
3.2统计结果展示
共实验20次(表格内为获奖次数)
一等奖 二等奖 三等奖 一等奖 二等奖 三等奖
第1位顾客 2 2 2 第26位顾客 1 0 4
第2位顾客 0 1 3 第27位顾客 1 1 2
第3位顾客 1 2 1 第28位顾客 1 1 2
第4位顾客 2 1 3 第29位顾客 0 1 3
第5位顾客 1 0 4 第30位顾客 1 3 2
第6位顾客 0 3 3 第31位顾客 0 1 2
第7位顾客 0 2 4 第32位顾客 1 2 2
第8位顾客 1 0 3 第33位顾客 0 2 0
第9位顾客 0 0 3 第34位顾客 2 2 2
第10位顾客 0 2 0 第35位顾客 3 1 4
第11位顾客 2 2 2 第36位顾客 1 1 3
第12位顾客 1 1 5 第37位顾客 1 3 0
第13位顾客 1 1 1 第38位顾客 0 2 2
第14位顾客 0 1 6 第39位顾客 1 1 2
第15位顾客 0 3 2 第40位顾客 0 1 4
第16位顾客 2 4 2 第41位顾客 1 0 4
第17位顾客 1 0 4 第42位顾客 0 2 3
第18位顾客 0 2 2 第43位顾客 1 2 4
第19位顾客 1 2 1 第44位顾客 2 1 1
第20位顾客 0 2 1 第45位顾客 2 0 3
第21位顾客 0 4 2 第46位顾客 0 1 1
第22位顾客 1 1 1 第47位顾客 2 0 2
第23位顾客 1 3 2 第48位顾客 1 2 4
第24位顾客 0 4 1 第49位顾客 0 3 2
第25位顾客 1 3 2 第50位顾客 1 0 3
3.2数据分析
由统计结果可知,一、二、三等奖获奖次数分布基本均匀。
前五位顾客共获得一等奖6次、二等奖6次、三等奖12次、共计24次,后五位顾客获得一等奖4次、二等奖6次、三等奖12次、共计22次,中间五位(随机选出34-38位)获得一等奖7次、二等奖9次,三等奖11次,共计27次。
4.结论得出
根据实验结果数据,我组基本得出抽奖中奖率和依次抽奖时抽奖顺序无关。