www.pudn.com > eval-1.2.zip > random.c
#include#include "random.h" #define N 624 #define M 397 #define MATRIX_A 0x9908b0dfUL #define UPPER_MASK 0x80000000UL #define LOWER_MASK 0x7fffffffUL static unsigned long mt[N]; static int mti = N + 1; static double BERg, BERb, Pgb, Pbg; void init_genrand(unsigned long s) { mt[0]= s & 0xffffffffUL; for (mti=1; mti > 30)) + mti); mt[mti] &= 0xffffffffUL; } } void init_by_array(unsigned long init_key[], int key_length) { int i=1, j=0, k; init_genrand(19650218UL); for (k = N > key_length ? N : key_length; k; k--) { mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL)) + init_key[j] + j; mt[i] &= 0xffffffffUL; i++; j++; if (i >= N) { mt[0] = mt[N-1]; i = 1; } if (j >= key_length) j = 0; } for (k=N-1; k; k--) { mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL)) - i; mt[i] &= 0xffffffffUL; i++; if (i >= N) { mt[0] = mt[N-1]; i = 1; } } mt[0] = 0x80000000UL; } void init_rand(void) { static unsigned long init[] = {0xAFFE, 0xDEAD, 0x42, 42, 0}; static int l = sizeof init / sizeof *init; init[l - 1] = time(0); init_by_array(init, l); } unsigned long genrand_int32(void) { unsigned long y; static unsigned long mag01[2] = {0, MATRIX_A}; if (mti >= N) { int kk; if (mti == N + 1) init_genrand(5489); for (kk=0; kk > 1) ^ mag01[y & 1UL]; } for (; kk > 1) ^ mag01[y & 1UL]; } y = (mt[N-1] & UPPER_MASK) | (mt[0] & LOWER_MASK); mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 1UL]; mti = 0; } y = mt[mti++]; y ^= (y >> 11); y ^= (y << 7) & 0x9d2c5680UL; y ^= (y << 15) & 0xefc60000UL; y ^= (y >> 18); return y; } long genrand_int31(void) { return genrand_int32() >> 1; } double genrand_real1(void) { return genrand_int32() / 4294967295.; } double genrand_real2(void) { return genrand_int32() / 4294967296.; } double genrand_real3(void) { return (genrand_int32() + .5) / 4294967296.; } double genrand_res53(void) { unsigned long a = genrand_int32() >> 5, b = genrand_int32() >> 6; return (a * 67108864. + b) / 9007199254740992.; } int Gauss(int p) { return p / 2 == 1 + (int) (p * (double)genrand_int32() / 4294967296.); } unsigned long rand_range(int from, int to) { return from + (int) ((to - from + 1) * (double)genrand_int32() / 4294967296.); } void init_GE(int BER, int stateratio, int bgratio) { Pgb = .001, Pbg = stateratio * Pgb, BERg = (1. / BER) * (stateratio + 1) / (stateratio + bgratio); BERb = (1. / BER) * (stateratio + 1) * bgratio / (stateratio + bgratio); } int GilbertElliot(int ignore) { static int state = 1; int bit = genrand_res53() < (state ? BERg : BERb); state = genrand_res53() < (state ? Pgb : Pbg); return bit; }