📄 gaussrandom.cpp
字号:
// GaussRandom.cpp: implementation of the CGaussRandom class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DesDemo.h"
#include "GaussRandom.h"
#include <math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGaussRandom::CGaussRandom()
{
}
CGaussRandom::~CGaussRandom()
{
}
DWORD CGaussRandom::Seq32(DWORD Key)
{
int i;
for(i=0;i<32;i++)
{
_asm
{
MOV EBX,Key;
SHL EBX,1
MOV EAX,Key;
MOV EDX,MCoef_32[0];
AND EAX,EDX; //select the bit for xor
MOV EDX,EAX;
SHR EAX,16;
XOR AX,DX;
XOR AH,AL; // because P only judge one byte
// so must XOR to judge the p of whole word
JP NEXT //jp equals the xor
INC EBX
NEXT: MOV Key,EBX;
}
}
return Key;
}
WORD CGaussRandom::RNG()
{
DWORD A,B;
_asm
{
_emit 0x0f
_emit 0x31
MOV A,EAX
MOV B,EDX
}
m_RandomKey = Seq32(m_RandomKey^A^B);
return (WORD)m_RandomKey;
}
DWORD CGaussRandom::RNG32()
{
DWORD A,B;
_asm
{
_emit 0x0f
_emit 0x31
MOV A,EAX
MOV B,EDX
}
m_RandomKey32 = Seq32(m_RandomKey32^A^B);
return m_RandomKey32;
}
/////////////////////////////////////////////////////////////////
//生成正态分布函数和正态分布概率密度函数表,表宽度为3倍方差
//正态分布函数均值为0,方差为1
//FTable: 正态分布函数表
//fTable: 正态分布概率密度表
//Length: 表的长度
/////////////////////////////////////////////////////////////////
void CGaussRandom::NormalTable(float *FTable, float * fTable,int Length)
{
int i;
float h; // 步长
float x,temp;
float C;
x=-3;
h= (float)6.0/Length/2;
FTable[0]=0;
C=(float)(1/sqrt(2*3.1415927));
// 初始参数设置
fTable[0]= (float)exp(-x*x/2)*C;
// 起始点的概率密度 ,exp(-x*x/2)*C为概率密度函数
for(i=1;i<Length;i++)
{
x+=h;
temp = (float)exp(-x*x/2)*C;
x+=h;
fTable[i] = (float)exp(-x*x/2)*C;
// 计算正态分布概率密度函数
FTable[i] = FTable[i-1]+(fTable[i-1]+4*temp+fTable[i])*h/3;
//辛普森数值积分公式计算正态分布函数
}
}
////////////////////////////////////////////////////////////////////////
//生成均值为0,方差为1的高斯随机数
//Gauss_F: 正态分布函数表,规格如上,可以由NormalTable函数生成
//Length: 正态分布函数表的长度
//返回值:均值为0,方差为1的高斯分布随机数
////////////////////////////////////////////////////////////////////////
float CGaussRandom::NormalRNG()
{
float * Gauss_F,*fTable;
int Length = 256;
Gauss_F = new float[Length];
fTable = new float[Length];
NormalTable(Gauss_F,fTable,Length);
float RandomNumber;
float temp,h;
int i;
// 正态分布表的步长
h= (float)(6.0/Length);
//产生一个[0,1)区间内均匀随机数
temp = (float)RNG()/65536;
if(temp == 0)
return 0;
for(i=0;i<Length;i++)
{
if(temp<=Gauss_F[i]) //计算随机数落入正态分布表的哪个区间
{
//进行线性差值
RandomNumber = (-3+h*i)+(temp-Gauss_F[i-1])/(Gauss_F[i]-Gauss_F[i-1])*h;
break;
}
}
delete[] Gauss_F;
delete[] fTable;
return RandomNumber;
}
int CGaussRandom::Random(int nMin,int nMax)
{
float fRand = NormalRNG();
int n = nMax - nMin;
int n2 = 10;
while((nMax-nMin)/n2!=0)
n2 *=10;
int fNR = (int)((float)(fRand*n2))%n;
return abs((fNR+nMin)%nMax);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -