www.pudn.com > LDPCCode.rar > random.c


#include "random.h" 
 
long s1,s2; 
 
/*Generate a uniform random number between 0 and 1.*/ 
double random_source() 
{ 
	long z,k; 
	k = s1 / 53668L; 
	s1 = 40014L * (s1 - k * 53668L) - k * 12211L; 
	if(s1 < 0) 
		s1 = s1 + 2147483563L; 
	k = s2 / 52774; 
	s2 = 40692L * (s2 - k * 52774L) - k * 3791L; 
	if(s2 < 0) 
		s2 = s2 + 2147483399L; 
	z = s1 - s2; 
	if(z < 1) 
		z = z + 2147483562L; 
	 
	return (double) z / (double) 2147483563.0; 
} 
 
/*Generate a uniform random number between -1 and 1. */ 
double generate_random_source() 
{ 
	double sign; 
	if(random_source() >= 0.5) 
		sign = -1.0; 
	else 
		sign = 1.0; 
	return sign * random_source(); 
} 
 
/*Generate a random number 0 and 1 with p0=p1=0.5.*/ 
short generate_binary_source() 
{ 
	if(random_source() < 0.5) 
		return 0; 
	else 
		return 1; 
} 
 
/*Generate a gaussian random with 0 mean sigma2 variance. */ 
double generate_gaussian_source(double sigma2) 
{ 
	static int iset = 0;	/* It save the last value. */ 
	static double gset; 
	double fac,r,v1,v2; 
	 
	if(iset == 0) 
	{ 
		do 
		{ 
			v1 = generate_random_source(); 
			v2 = generate_random_source(); 
			r = v1 * v1 + v2 * v2; 
		}while(r >= 1.0 || r == 0.0); 
		fac = sqrt(-2.0 * sigma2 * log(r) / r); 
		gset = v1 * fac; 
		iset = 1; 
		return (double)(v2 * fac); 
	} 
	else 
	{ 
		iset = 0; 
		return (double)(gset); 
	} 
}