#include <iostream.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>
#include <time.h>
#include <winbase.h>
#include <stdio.h>
//#include <stdAfx.h>
//#include <Worker.h>
static int t;
static int flag[20];
static int turn=-1;
struct ID

int id;
};
int random(int max)
{
return rand()%(max+1);
}
void wait(int n,int i)
{   
int time;
    int max;
if(n<10)
{
max=(int)pow(2,n);
time=5*random(max);
}
else
time=5*random(1024);
Sleep(time);
}
bool judge(int i)
{
int n=0;
    flag[i]=0;
    while(turn!=-1)
Sleep(1);
flag[i]=1;
    Sleep(1);
int k=0;
while(k<20&&((flag[k]==0)||(k==i)))
k++;
if(k==20)
{
turn=i;
return true;
}
n++;
while(n<15)
{
    
flag[i]=0;
        wait(n,i);
    while(turn!=-1)
    flag[i]=1;
        Sleep(1);
    int k=0;
    while(k<20&&((flag[k]==0)||(k==i)))
    k++;
    if(k==20)
{
    turn=i;
    return true;
}
n++;
}
flag[i]=0;
return false;
}
void send(int i)
{
    if(judge(i))
{ Sleep(80);
t=t+80;
flag[i]=0;
turn=-1;
}
else 
{
}
int k=random(9999);
if(k<80)  
 send(i);
}class CWorker
{
public:
CWorker(void);
~CWorker(void);
int DoWork(void);
};
CWorker::CWorker(void)
{
}
CWorker::~CWorker(void)
{
}
static DWORD WINAPI ThreadProo(LPVOID num)
{
int i=((ID*)num)->id;
while(true)
{
int k=random(9999);
if(k==0) 
send(i);
Sleep(1);
}
}
int CWorker::DoWork(void)
{
for(int i=0;i<20;i++)
{   
ID *num=new ID;
num->id=i;
HANDLE thread=::CreateThread(NULL,0,ThreadProo,(LPVOID)num,0,NULL);
::CloseHandle(thread);
}
    return 0;
}
int main()
{
srand((unsigned)time(NULL));
for(int i=0;i<20;i++)
{
        flag[i]=0;
}
    CWorker worker;
worker.DoWork();
Sleep(60000);
double p=t/60000.0;
cout<<p<<endl;
return 1;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
同学做的一道题目,就是模拟802.3MAC协议的运行情况。模拟2台主机,每台主机的帧到达服从泊松分布,帧的到达率为十帧/秒。总线速率为10Mbps,帧长固定为1000octets,最大往返传播时延是10us,要求的是总线利用率。N为判断回避次数,如果已经回避了15次以上则丢弃该帧。现在的问题是由时候结果是正确的,有时候确实错误的,大家帮忙看一下。下面这个是人家用数组完成的一个程序。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <iostream.h>
#include <windows.h>
#include <math.h>
#include <time.h>
#include <stdio.h>int count=0;      //放弃帧的数目
int t=0;          //占用总线的次数
int flag[20];     //是否准备发送
int turn=-1;      //谁在占用总线,-1时为空闲
int buf[20];      //帧的缓存区
int wait[20];     //等待时间
int sendtime=0;   //发送时间   
int N[20];        //回避次数
int Wy[20];       //冲突检查次数
int n;             
int cc=0;         //冲突次数
int random(int max)      //生产随机数
{
return rand()%(max+1);
}
int Wait(int N,int i)    //产生等待时间
{   int time;
    int max;
if(N<10)
{
max=pow(2,N);
time=16*random(max);//每作一次用时3.2us,51.2/3.2=16
}
else
time=16*random(1024);
return time;
}
bool collison(int j)   //检测冲突
{
   int k=0;
   while((k<20)&&((flag[k]==0)||(k==j)))  //判断有无其他也处于发送状态
   k++;
   if(k==20)            //没有,不冲突
       return false;
   else                 //冲突
   {
     cc++;          //冲突次数增加
     Wy[j]=0;       //检测次数归0
 flag[j]=0;     //回到不发送状态
 if(N[j]>=15)    //若回避次数〉14,则放弃
 { buf[j]--;    //缓存减小
N[j]=0;
count++;     //放弃帧数增加
 }
 else
 {
 N[j]++;
 int n=N[j];
     wait[j]=Wait(n,j);   //获得等待时间
 }
 return true;   }
}int main()
{
srand((unsigned)time(NULL));
for(int m=0;m<20;m++)   //变量初始化
{
flag[m]=0;
buf[m]=0;
        wait[m]=0;
        N[m]=0;
        Wy[m]=0;
}
for(int i=0;i<10000000;i++)  //每次执行时间为3.2us 
{
for(int j=0;j<20;j++)  //对20台主机轮寻 
{
int f;
f=rand();          //产生0-32767随机数
if(f==0)           //3.2us内产生帧的概率为0.000032;而在0-32767中产生0的概率为1/32768=0.000030近似相等;
buf[j]++;      //帧个数增加
if(wait[j]!=0)   //检查回避 
{
wait[j]--;   //减少回避时间
continue;
}
if(turn==j)     //检查是否已经占有总线
{
if(sendtime==0)  //有无发送完成
{
buf[j]--;     
flag[j]=0;
turn=-1; //释放总线
}
else
{
                   sendtime--;
   t++;
   continue;
}
}
if(flag[j]>0)      
{
if(Wy[j]>0)  //检测冲突次是否完成
{
if(!collison(j))
      Wy[j]--;  //不冲突则检测次数减少
}
else        
{
    turn=j;     //在传播时延内没有冲突则获得总线
sendtime=250;
N[j]=0;
}
continue;
}
if((buf[j]>0)&&(turn==-1))  //有帧要发送且总线空闲的话
{
flag[j]=1;             //置为准备发送状态
if(!collison(j))
                 Wy[j]=2;               //不冲突,置检测次数为2,因为传播时延为10us,要检测3次;即2,1,0;故置2
} }
}
double p=t/10000000.0;
// cout<<"总线占用时间:     "<<3.2*t<<"us"<<endl;
cout<<"总线效率:         "<<p<<endl;
// cout<<"冲突次数:         "<<cc<<endl;
return 0;