//----------------------------------------------------------------------------------- // RNDXor128.mqh // 2011, victorg // http://www.mql5.com //----------------------------------------------------------------------------------- #property copyright "2011, victorg" #property link "http://www.mql5.com" #include //----------------------------------------------------------------------------------- // Генерация псевдослучайной последовательности. Используется алгоритм Xorshift RNG // (George Marsaglia) с периодом генерируемой последовательности (2**128)-1. // uint rand_xor128() // { // static uint x=123456789,y=362436069,z=521288629,w=88675123; // uint t=(x^(x<<11));x=y;y=z;z=w; // return(w=(w^(w>>19))^(t^(t>>8))); // } // Методы: // Rand() - равномерное распределение на отрезке [0,UINT_MAX=4294967295]. // Rand_01() - равномерное распределение на отрезке [0,1]. // Rand_Norm() - нормальное распределение с нулевым средним и единичной дисперсией. // Rand_Exp() - экспоненциальное распределение с параметром 1.0. // Rand_Laplace() - распределение Лапласа параметром 1.0 // Reset() - сброс всех исходных значений в первоначальное состояние. // SRand() - установка новых исходных значений генератора. //----------------------------------------------------------------------------------- #define xor32 xx=xx^(xx<<13);xx=xx^(xx>>17);xx=xx^(xx<<5) #define xor128 t=(x^(x<<11));x=y;y=z;z=w;w=(w^(w>>19))^(t^(t>>8)) #define inidat x=123456789;y=362436069;z=521288629;w=88675123;xx=2463534242 class RNDXor128:public CObject { protected: uint x,y,z,w,xx,t; uint UINT_half; public: RNDXor128() {UINT_half=UINT_MAX>>1;inidat;}; double Rand() {xor128;return((double)w);}; int Rand(double& a[],int n) {int i;if(n<1)return(-1); if(ArraySize(a)=1.0||s==0.0); sln=MathLog(s);sln=MathSqrt((-sln-sln)/s); ra=v2*sln;b=w; return(v1*sln);}; int Rand_Norm(double& a[],int n) {int i;if(n<1)return(-1); if(ArraySize(a)UINT_half) {a=2.0-a; if(a==0.0)return(-DBL_MAX); return(MathLog(a));} else {if(a==0.0)return(DBL_MAX); return(-MathLog(a));}}; int Rand_Laplace(double& a[],int n) {int i;if(n<1)return(-1); if(ArraySize(a)