⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sys_random.cpp

📁 此程序为wcdma系统当中ftp/video业务模型的c++程序仿真 通过此程序 能得到此两种业务在多种条件下的吞吐量和无码率的性能
💻 CPP
字号:
#include "math.h"
#include "stdio.h"
#include "iostream.h"
//#include "fstream.h"

#include "iomanip.h"   /////////////for setw();
#include "string.h"
				  // C string library
#include "include.h"
#include "boolean.h"
#include "extreal.h"
#include "myexcept.h"
#include "newran.h"
#include "systemsim.h"
#include "sys_random.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

int xPoisson1(Real);
int xPoisson2(Real);
//void initialize()
//{
//   Random c;
//   c.Set(0.4356);
//}

int xPoisson(long UN,float detT,float u)
{
  int yy;
  Real mean=UN*detT*u;
  if(mean<=13.89)
//  Histogram(&y,5000) ;  /////////////////////////////////
//  getchar();
	yy=xPoisson1(mean);
  else
  {
	yy=xPoisson2(mean);
  }
  return yy;
}

int xPoisson1(Real mean1)
{
  Poisson y(mean1);
//  Histogram(&y,5000) ;  /////////////////////////////////
//  getchar();
  return (int)y.Next();
}

int xPoisson2(Real mean2)
{
   int k=0;
   float f1,f,s2;
   Uniform y;
   f=(float)y.Next();
   s2=(float)exp(-mean2);
   f1=s2;
   if((f>0.0)&&(f<=f1))
	 k=0;
   else
   {
	 int i=0;
	 do
	 {
	   i++;
	   s2=(float)((mean2/i)*s2);
	   f1+=s2;

	 }
	 while(!(f<=f1));
	 k=i;
   }
   return k;
}

float xUniform(float down,float up)              //均匀产生一个介于down和up之间的数
{
  Uniform y;
  float rn,fact;
  fact=up-down;
  rn=(float)(y.Next()*fact)+down;
  return rn;
}

float xExponent(float fCallLength)
{
  Exponential y;
  return (float)(y.Next()*fCallLength);
}

/*
float Shadow_Fading()
{
  Normal y;
  float m_fading;
  m_fading=1./pow(10.,y.Next()/10.0*SV);
  if(m_fading<FadingMargin) m_fading=FadingMargin;
  if(m_fading>(1.0/FadingMargin)) m_fading=(1.0/FadingMargin);
  return m_fading;
//  return 4.*y.Next();
}
float Next_Shadow_Fading(float sf,float v,float detT)
{
  const double X=20.;
  Normal yy;
  double y,m_fading;
  y=log10(sf)*exp(-v*detT/X)*10.0/SV+yy.Next()*sqrt((1-exp(-2*v*detT/X)));
  m_fading=1./pow(10.,y/10.0*SV);
  if(m_fading<FadingMargin) m_fading=FadingMargin;
  if(m_fading>(1.0/FadingMargin)) m_fading=(1.0/FadingMargin);
  return m_fading;
}
*/
//注掉float Shadow_Fading()和float Next_Shadow_Fading(float sf,float v,float detT)
//的原因是由于近场衰落的标准差SV在此次仿真程序中还未定义。

/*
int xGeometry(float q)
{
  Uniform yy;
  float F,F1,F2;
  int y;
  F1=0.;
  F2=q;
  F=yy.Next();
//  cout<<"F=="<<F<<endl;
//  getchar();
  if ((F>0.)&&(F<=(1-F2)))
	 y=1;
  else
  {
	int i=0;
	do
	{
	  i++;
	  F1=F2;
	  F2*=q;
	}
	while (!((F>(1.0-F1))&&(F<=(1.0-F2))));

	y=i+1;
  }
return y;
}

int xMixed_Geometry(float q1,float q2,float c1,float c2)
{
  Uniform yy;
  float F,F1,s1,s2;
  int y;
  s1=q1;
  s2=q2;
  F=yy.Next();
  F1=c1*(1-s1)+c2*(1-s2);
//  cout<<"F=="<<F<<endl;
//  getchar();
  if (F<=F1)
	 y=1;
  else
  {
	int i=0;
	do
	{
	  i++;
	  s1*=q1;
	  s2*=q2;
	  F1=c1*(1-s1)+c2*(1-s2);
	}
	while (!(F<=F1));

	y=i+1;
  }
return y;
}
*/
//注掉int xGeometry(float q)和int xMixed_Geometry(float q1,float q2,float c1,float c2)
//的原因是两个函数在原仿真程序中并没有使用,而且xGeometry的运行结果有些问题

//以下是重新编写的int xGeometry(float p)函数
//返回一个均值为mean=1/p的服从几何分布的随机变量。p的取值在0,1之间。
int xGeometry(float p)
//p=1/u
{
	Geometry tt(p);
	return tt.iNext();
}

int xPareto(float shape,float scale,int MTU)
//返回服从Pareto分布的一个整型变量,PacketCall的大小服从Pareto分布。
//此分布为Pareto with cutoff;shape和scale为Pareto分布的参数,MTU为PacketCall的最大取值
{
	Pareto s(shape,scale);
	int iSize=(int)s.Next();
	int iPacketCallSize;
	iPacketCallSize=iSize<MTU?iSize:MTU;
	return iPacketCallSize;
}

float xLognormal(float fmean,float fstd,float fmax,float fmin)
//返回一个服从对数正态分布的变量
{
	Normal n;
	double normal1,normal2;
	float lognormal;
	normal1=n.Next();//得到一个正态分布的数,均值为0,方差为1
    normal2=normal1*fstd+fmean;//得到一个服从均值为mean,方差为var的正态随机数
    lognormal=float(exp(normal2));//得到一个对数正态随机数
	if(lognormal>=fmax)
		lognormal=fmax;
	if(lognormal<=fmin)
		lognormal=fmin;
	return lognormal;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -