📄 random.cpp
字号:
#include "random.h"namespace CAEP{ CARandom::CARandom(float seed) { Init(seed); InitNormalDeviate(); } void CARandom::Init(float seed) { int i; for(i=0; i<=54; i++) oldRand[i] = 0.0; jRand=0; WarmUpRandom(seed); } void CARandom::InitNormalDeviate(float calcFlag) { randCalcFlag = calcFlag; } void CARandom::WarmUpRandom(float seed) { int i, j; double new_random, prev_random; oldRand[54] = seed; new_random = 0.000000001; prev_random = seed; for(i = 1 ; i <= 54; i++) { j = (21*i)%54; oldRand[j] = new_random; new_random = prev_random-new_random; if(new_random<0.0) new_random = new_random + 1.0; prev_random = oldRand[j]; } AdvanceRandom(); AdvanceRandom(); AdvanceRandom(); jRand = 0; } void CARandom::AdvanceRandom() { int i; double new_random; for(i = 0; i < 24; i++) { new_random = oldRand[i] - oldRand[i+31]; if(new_random < 0.0) new_random = new_random + 1.0; oldRand[i] = new_random; } for(i = 24; i < 55; i++) { new_random = oldRand [i] - oldRand [i-24]; if(new_random < 0.0) new_random = new_random + 1.0; oldRand[i] = new_random; } } int CARandom::Flip(float prob) { if(RandomPerc() <= prob) return(1); else return(0); } float CARandom::RandomPerc() { jRand++; if(jRand >= 55) { jRand = 1; AdvanceRandom(); } return((float) oldRand[jRand]); } int CARandom::NextInt(int low, int high) { int i; if(low >= high) i = low; else { i = (RandomPerc() * (high - low + 1)) + low; if(i > high) i = high; } return(i); } float CARandom::NextFloat(float lo ,float hi) { return((RandomPerc() * (hi - lo)) + lo); } double CARandom::RandomNormalDeviate() { double t, rndx1; if(randCalcFlag) { rndx1 = sqrt(- 2.0*log((double) RandomPerc())); t = 6.2831853072 * (double) RandomPerc(); randX2 = sin(t); randCalcFlag = 0; return(rndx1 * cos(t)); } else { randCalcFlag = 1; return(randX2); } } double CARandom::Noise(double mu,double sigma) { return((RandomNormalDeviate()*sigma) + mu); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -