00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef IXLIB_RANDOM
00011 #define IXLIB_RANDOM
00012
00013
00014
00015
00016 #include <cstdlib>
00017 #include <cmath>
00018 #include <ctime>
00019 #include <ixlib_base.hh>
00020 #include <ixlib_numeric.hh>
00021
00022
00023
00024
00025 namespace ixion {
00026 class float_random {
00027 double Seed;
00028
00029 public:
00030 float_random()
00031 : Seed(1)
00032 { }
00033
00034 void init() {
00035 double current_time = time(NULL);
00036 Seed = current_time*sin(current_time);
00037 }
00038 void init(double seed)
00039 { Seed = NUM_ABS(seed); }
00040
00042 double operator()(double max = 1) {
00043
00044 while (Seed > 3) Seed = log(Seed);
00045 Seed -= floor(Seed);
00046 Seed = pow(Seed+Pi,8);
00047 Seed -= floor(Seed);
00048 return Seed*max;
00049 }
00050 };
00051
00052
00053
00054
00055 class int_random {
00056 float_random Generator;
00057
00058 public:
00059 int_random()
00060 { }
00061
00062 void init()
00063 { Generator.init(); }
00064 void init(unsigned seed)
00065 { Generator.init(seed); }
00066
00068 unsigned operator()(unsigned max = 32768) {
00069 unsigned num = rng8() + (rng8() << 7) + (rng8() << 14) + (rng8() << 21) + (rng8() << 28);
00070 return num % max;
00071 }
00072 private:
00073 TUnsigned8 rng8() {
00074 return (TUnsigned8) (Generator()*256);
00075 }
00076 };
00077 }
00078
00079
00080
00081
00082 #endif