/************************ RANCOMBI.CPP ****************** AgF 2001-10-18 *
* *
* This file defines a template class for combining two different *
* random number generators. A combination of two random number *
* generators is generally better than any of the two alone. *
* The two generators should preferably be of very different design. *
* *
* Instructions: *
* To make a combined random number generator, insert the class names *
* of any two random number generators, as shown in the example below. *
* *
*************************************************************************/
#include "randomc.h"
// This template class combines two different random number generators
// for improved randomness. R1 and R2 are any two different random number
// generator classes.
template <class RG1, class RG2>
class TRandomCombined : private RG1, private RG2 {
public:
TRandomCombined(int32 seed = 19) : RG1(seed), RG2(seed+1) {};
void RandomInit(int32 seed) { // re-seed
RG1::RandomInit(seed);
RG2::RandomInit(seed+1);}
double Random() {
long double r = RG1::Random() + RG2::Random();
if (r >= 1.) r -= 1.;
return r;}
long IRandom(long min, long max){ // output random integer
// get integer random number in desired interval
int iinterval = max - min + 1;
if (iinterval <= 0) return -1; // error
int i = int(iinterval * Random()); // truncate
if (i >= iinterval) i = iinterval-1;
return min + i;}};
//////////////////////////////////////////////////////////////////////////
/* Example showing how to use the combined random number generator:
#include <stdio.h>
#include <time.h>
#include "randomc.h"
#include "mersenne.cpp"
#include "ranrotw.cpp"
#include "rancombi.cpp"
int main() {
// Make an object of the template class. The names inside <> define the
// class names of the two random number generators to combine.
// Use time as seed.
TRandomCombined<TRanrotWGenerator,TRandomMersenne> RG(time(0));
for (int i=0; i<20; i++) {
// generate 20 random floating point numbers and 20 random integers
printf("\n%14.10f %2i", RG.Random(), RG.IRandom(0,99));}
return 0;}
*/