00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "randomc.h"
00019
00020
00021
00022 uint32 CRandomMother::BRandom() {
00023 uint64 sum;
00024 sum = (uint64)2111111111ul * (uint64)x[3] +
00025 (uint64)1492 * (uint64)(x[2]) +
00026 (uint64)1776 * (uint64)(x[1]) +
00027 (uint64)5115 * (uint64)(x[0]) +
00028 (uint64)x[4];
00029 x[3] = x[2]; x[2] = x[1]; x[1] = x[0];
00030 x[4] = uint32(sum >> 32);
00031 x[0] = uint32(sum);
00032 return x[0];
00033 }
00034
00035
00036
00037 double CRandomMother::Random() {
00038 return (double)BRandom() * (1./(65536.*65536.));
00039 }
00040
00041
00042
00043 int CRandomMother::IRandom(int min, int max) {
00044
00045
00046 if (max <= min) {
00047 if (max == min) return min; else return 0x80000000;
00048 }
00049
00050 int r = int((max - min + 1) * Random()) + min;
00051 if (r > max) r = max;
00052 return r;
00053 }
00054
00055
00056
00057 void CRandomMother::RandomInit (uint32 seed) {
00058 int i;
00059 uint32 s = seed;
00060
00061 for (i = 0; i < 5; i++) {
00062 s = s * 29943829 - 1;
00063 x[i] = s;
00064 }
00065
00066 for (i=0; i<19; i++) BRandom();
00067 }