// this function initializes the random number generator: void CRandomMother::RandomInit (int seed) { int i; uint32_t s = seed; // make random numbers and put them into the buffer for (i = 0; i < 5; i++) { s = s * 29943829 - 1; x[i] = s; } // randomize some more for (i=0; i<19; i++) BRandom(); }
double TRanrotWGenerator::Random() { // returns a random number between 0 and 1. uint32 z = BRandom(); // generate 64 random bits switch (Architecture) { case EXTENDEDPRECISIONLITTLEENDIAN: // 80 bits floats = 63 bits resolution randbits[1] = z | 0x80000000; break; case LITTLEENDIAN: // 64 bits floats = 52 bits resolution randbits[1] = (z & 0x000FFFFF) | 0x3FF00000; break; case BIGENDIAN: // 64 bits floats = 52 bits resolution randbits[0] = (randbits[0] & 0x000FFFFF) | 0x3FF00000; break; case NONIEEE: default: // not a recognized floating point format. 32 bits resolution return (double)z * (1./((double)(uint32)(-1L)+1.));} return (double)(randp1 - 1.0);}
// returns integer random number in desired interval: int CRandomMother::IRandom(int min, int max) { // Output random integer in the interval min <= x <= max // Relative error on frequencies < 2^-32 if (max <= min) { if (max == min) return min; else return 0x80000000; } // Assume 64 bit integers supported. Use multiply and shift method uint32_t interval; // Length of interval uint64_t longran; // Random bits * interval uint32_t iran; // Longran / 2^32 interval = (uint32_t)(max - min + 1); longran = (uint64_t)BRandom() * interval; iran = (uint32_t)(longran >> 32); // Convert back to signed and return result return (int32_t)iran + min; }
void TRanrotWGenerator::RandomInit (uint32 seed) { // this function initializes the random number generator. int i, j; // make random numbers and put them into the buffer for (i=0; i<KK; i++) { for (j=0; j<2; j++) { seed = seed * 2891336453UL + 1; randbuffer[i][j] = seed;}} // set exponent of randp1 randbits[2] = 0; randp1 = 1.0; // initialize pointers to circular buffer p1 = 0; p2 = JJ; // store state for self-test memcpy (randbufcopy, randbuffer, 2*KK*sizeof(uint32)); memcpy (randbufcopy[KK], randbuffer, 2*KK*sizeof(uint32)); // randomize some more for (i=0; i<31; i++) BRandom(); }
// returns a random number between 0 and 1: double CRandomMother::Random() { return (double)BRandom() * (1./(65536.*65536.)); }