📄 sys_random.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 + -