00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "headers.h"
00022 #include "randomc.h"
00023 #ifndef __BORLANDC__
00024
00025
00026
00027
00028 #endif
00029
00030 TRanrotBGenerator::TRanrotBGenerator() {
00031 RandomInit(time(NULL));
00032 }
00033
00034
00035
00036 TRanrotBGenerator::TRanrotBGenerator(long int seed) {
00037 RandomInit(seed);
00038 }
00039
00040
00041
00042 double TRanrotBGenerator::Random() {
00043 Guard guard(&m_mutex);
00044 unsigned long x;
00045
00046 x = randbuffer[p1] = _lrotl(randbuffer[p2], R1) + _lrotl(randbuffer[p1], R2);
00047
00048 if (--p1 < 0) p1 = KK - 1;
00049 if (--p2 < 0) p2 = KK - 1;
00050 #ifdef SELF_TEST
00051
00052 if (randbuffer[p1] == randbufcopy[0] &&
00053 memcmp(randbuffer, randbufcopy+KK-p1, KK*sizeof(uint32)) == 0) {
00054
00055 if ((p2 + KK - p1) % KK != JJ) {
00056
00057
00058 printf("Random number generator not initialized");
00059 }
00060 else {
00061 printf("Random number generator returned to initial state");
00062 }
00063 exit(1);
00064 }
00065 #endif
00066
00067 union {
00068 double randp1;
00069 unsigned long randbits[2];
00070 };
00071 randbits[0] = x << 20;
00072 randbits[1] = (x >> 12) | 0x3FF00000;
00073 return randp1 - 1.0;
00074 }
00075
00076
00077
00078 int TRanrotBGenerator::IRandom(int min, int max) {
00079 Guard guard(&m_mutex);
00080 int iinterval = max - min + 1;
00081 if (iinterval <= 0) {
00082 return 0x80000000;
00083 }
00084 int i = iinterval * Random();
00085 if (i >= iinterval) {
00086 i = iinterval-1;
00087 }
00088 return (min + i);
00089 }
00090
00091
00092 void TRanrotBGenerator::RandomInit(long int seed) {
00093 Guard guard(&m_mutex);
00094
00095 int i;
00096 unsigned long s = seed;
00097
00098
00099 for (i=0; i<KK; i++) {
00100 s = s * 2891336453 + 1;
00101 randbuffer[i] = s;
00102 }
00103
00104
00105 union {
00106 double randp1;
00107 unsigned long randbits[2];
00108 };
00109 randp1 = 1.5;
00110 assert(randbits[1]==0x3FF80000);
00111
00112
00113 p1 = 0; p2 = JJ;
00114 #ifdef SELF_TEST
00115
00116 memcpy (randbufcopy, randbuffer, KK*sizeof(uint32));
00117 memcpy (randbufcopy+KK, randbuffer, KK*sizeof(uint32));
00118 #endif
00119
00120 for (i=0; i<9; i++) {
00121 Random();
00122 }
00123 }
00124