⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 random.cpp

📁 Turbo码BCJR传统经典算法的C语言实现,经典,对于学习MAP算法的人很有帮助.
💻 CPP
字号:
#include "random.h"

/*
Long period (? 2 \Theta 10 18 ) random number generator of L'Ecuyer with Bays璂urham shuffle
and added safeguards. Returns a uniform random deviate between 0.0 and 1.0 (exclusive of
the endpoint values). Call with idum a negative integer to initialize; thereafter, do not alter
idum between successive deviates in a sequence. RNMX should approximate the largest floating
value that is less than 1.
--
*/

double Random::ran2()
{
	int j;
	long k;
	double temp;


	k=(idum)/IQ1;
	idum=IA1*(idum-k*IQ1)-k*IR1;  // Compute idum=(IA1*idum) % IM1 without overflows by Schrage's method.
	if (idum < 0)
		idum += IM1;
	k=idum2/IQ2;
	idum2=IA2*(idum2-k*IQ2)-k*IR2;	// Compute idum2=(IA2*idum) % IM2 likewise.
	if (idum2 < 0)
   	idum2 += IM2;
   j = iy/NDIV;
   iy=iv[j]-idum2;
//	iy=iv[j]-idum2; 		// Here idum is shuffled, idum and idum2 are combined to generate output.
	iv[j] = idum;
	if (iy < 1)
		iy += IMM1;
	if ((temp=AM*iy) > RNMX)
		return RNMX; 		// Because users don't expect endpoint values.
	else
		return temp;
}


void Random::init(long seed)
{
	idum2=123456789;
   idum=0;
	iy=0;

	if (seed != 0)
		idum = seed;
   else
   	idum = 1;


	for (int j=NTAB+7;j>=0;j--) // Load the shuffle table (after 8 warm璾ps).
	{
		long k=(idum)/IQ1;

		idum=IA1*(idum-k*IQ1)-k*IR1;
		if (idum < 0)
			idum += IM1;
		if (j < NTAB)
			iv[j] = idum;
	}
	iy=iv[0];
}

Random::Random(long seed)
{
	init(seed);
}

Random::Random()
{
   time_t t;

   time(&t);

   init((long)t);
}

double Random::doublerandom()
{
	double t = ran2();
   return t;
}

long Random::longrandom(long range)
{
	double t;

   t = doublerandom();
   return((long)(t*(double)range));
}

bool Random::boolrandom()
{
	double t=doublerandom();

   if (t>0.5)
   	return true;
   else
   	return false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -