www.pudn.com > Genecircus20070919.rar > Random.cpp


#include "Random.h" 
 
CRandom::CRandom(void) 
{ 
} 
 
CRandom::~CRandom(void) 
{ 
} 
const double PI = 3.14159265358979324; 
 
void CRandom::moment(history data,int n,double & ave,double & adev,double & sdev,double & var,double & skew,double & curt) 
{ 
	 int j; 
	 if(n<=1){return;} 
	 double p,s=0.0; 
	 for(j =0;j= (en + 1.0)); 
            em = ::floor(em); 
            t = 1.2 * sq * (1.0 + y * y) * 
                ::exp(oldg - log_gamma(em + 1.0) - 
                      log_gamma(en - em + 1.0) + 
                      em * plog + (en - em) * pclog); 
        } while (unidev() > t); 
        bnl = em; 
    } 
    if (p != pp) 
        bnl = n - bnl; 
    return bnl; 
} 
 
double CRandom::log_gamma(double xx) 
{ 
    double x, y, tmp, ser; 
    static double cof[6] = {76.18009172947146, 
                            -86.50532032941677, 
                            24.01409824083091, 
                            -1.231739572450155, 
                            0.1208650973866179e-2, 
                            -0.5395239384953e-5}; 
    y = x = xx; 
    tmp = x + 5.5; 
    tmp -= (x + 0.5) * ::log(tmp); 
    ser = 1.000000000190015; 
    for (int j = 0; j <= 5; ++j) 
        ser += cof[j] / ++y; 
    return -tmp + ::log(2.5066282746310005 * ser / x); 
} 
 
static double r[98]; 
static int iff,ix1,ix2,ix3; 
 
double CRandom::rand_uniform() 
{ 
	int idum = -(::wxGetElapsedTime()); 
    double rm1,rm2,t; 
	int m1,m2,m3,ia1,ia2,ia3,ic1,ic2,ic3,j; 
	m1 = 259200,ia1 = 7141,ic1 = 54773,rm1 = 0.0000038580247; 
	m2 = 134456,ia2 = 8121,ic2 = 28411,rm2 = 0.0000074373773; 
	m3 = 243000,ia3 = 4561,ic3 = 51349; 
	if((idum<0)||(iff == 0)){ 
	    iff = 1; 
		ix1 = (ic1-idum)%m1; 
		ix1 = (ia1*ix1 + ic1)%m1; 
		ix2 = ix1%m2; 
		ix1 = (ia1 * ix1 + ic1)%m1; 
		ix3 = ix1 %m3; 
		for(j = 1;j<= 97;j++){ 
			ix1 = (ia1*ix1+ic1)%m1; 
			ix2 = (ia2*ix2+ic2)%m2; 
			r[j] = (double(ix1)+double(ix2)*rm2)*rm1; 
		} 
		idum = 1; 
	} 
	ix1 = (ia1*ix1+ic1)%m1; 
	ix2 = (ia2*ix2+ic2)%m2; 
	ix3 = (ia3*ix3+ic3)%m3; 
	j = 1 + int((97*ix3)/m3); 
	if((j>97)||(j<1)){ 
		return 1; 
	} 
	t = r[j]; 
	r[j] = (float(ix1)+float(ix2)*rm2)*rm1; 
	return t; 
}