00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <stdlib.h>
00021 #include <time.h>
00022 #include <unistd.h>
00023 #include <math.h>
00024
00025 #include <archon/util/random.H>
00026
00027 static bool initialized;
00028
00029 static void init()
00030 {
00031
00032 time_t t;
00033
00034
00035 time(&t);
00036 srand(static_cast<unsigned>(t) + static_cast<unsigned>(getpid()));
00037
00038 initialized = true;
00039 }
00040
00041 namespace Archon
00042 {
00043 namespace Utilities
00044 {
00045 int drawInt(int bound)
00046 {
00047 if(!initialized) init();
00048 return static_cast<int>(static_cast<double>(bound)*rand()/(RAND_MAX+1.0));
00049 }
00050
00051 double drawFloat()
00052 {
00053 if(!initialized) init();
00054 return rand()/static_cast<double>(RAND_MAX);
00055 }
00056
00057 double drawFloatOpen()
00058 {
00059 if(!initialized) init();
00060 return rand()/(RAND_MAX+1.0);
00061 }
00062
00063 Math::Vector3 drawUnitVector3()
00064 {
00065 Math::Vector3 w;
00066 w[2] = drawFloat() * 2 - 1;
00067 double r = sqrt(1 - w[2] * w[2]);
00068 double a = drawFloatOpen() * 2 * M_PI;
00069 w[0] = r * cos(a);
00070 w[1] = r * sin(a);
00071 return w;
00072 }
00073 }
00074 }
00075