30 #ifndef GRT_RANDOM_HEADER
31 #define GRT_RANDOM_HEADER
34 #include "../Util/GRTVersionInfo.h"
47 Random(
unsigned long long seed = 0):v(4101842887655102017LL), w(1), storedval(0.0){
67 void setSeed(
unsigned long long seed = 0){
72 v = 4101842887655102017LL;
75 u = seed ^ v; int64();
106 if( values.size() != weights.size() )
return 0;
108 unsigned int N = (
unsigned int)values.size();
109 vector< IndexedDouble > weightedValues( N );
110 for(
unsigned int i=0; i<N; i++){
111 weightedValues[i].index = values[i];
112 weightedValues[i].value = weights[i];
130 unsigned int N = (
unsigned int)weightedValues.size();
132 if( N == 0 )
return 0;
133 if( N == 1 )
return weightedValues[0].index;
136 sort(weightedValues.begin(),weightedValues.end(),IndexedDouble::sortIndexedDoubleByValueAscending);
139 vector< double > x(N);
140 x[0] = weightedValues[0].value;
141 for(
unsigned int i=1; i<N; i++){
142 x[i] = x[i-1] + weightedValues[i].value;
149 for(
unsigned int i=0; i<N; i++){
150 if( randValue <= x[i] ){
151 return weightedValues[ i ].index;
174 unsigned int N = (
unsigned int)weightedValues.size();
176 if( weightedValues.size() != x.size() )
return 0;
182 for(
unsigned int i=0; i<N; i++){
183 if( randValue <= x[i] ){
184 return weightedValues[ i ].index;
198 return (doub()*(maxRange-minRange))+minRange;
209 double v1,v2,rsq,fac;
211 if (storedval == 0.){
216 }
while (rsq >= 1.0 || rsq == 0.0);
217 fac=sqrt(-2.0*log(rsq)/rsq);
219 return mu + sigma*v2*fac;
223 return mu + sigma*fac;
236 VectorDouble randomValues(numDimensions);
237 for(UINT i=0; i<numDimensions; i++){
252 VectorDouble randomValues(numDimensions);
253 for(UINT i=0; i<numDimensions; i++){
267 std::vector< unsigned int >
getRandomSubset(
const unsigned int startRange,
const unsigned int endRange,
const unsigned int subsetSize ){
270 const unsigned int rangeSize = endRange - startRange;
272 assert( rangeSize > 0 );
273 assert( endRange > startRange );
274 assert( subsetSize <= rangeSize );
276 std::vector< unsigned int > indexs( rangeSize );
277 std::vector< unsigned int > subset ( subsetSize );
280 for(i=startRange; i<endRange; i++){
283 std::random_shuffle(indexs.begin(), indexs.end());
286 for(i=0; i<subsetSize; i++){
287 subset[i] = indexs[i];
294 inline unsigned long long int64() {
295 u = u * 2862933555777941757LL + 7046029254386353087LL;
296 v ^= v >> 17; v ^= v << 31; v ^= v >> 8;
297 w = 4294957665U*(w & 0xffffffff) + (w >> 32);
298 unsigned long long x = u ^ (u << 21); x ^= x >> 35; x ^= x << 4;
301 inline double doub() {
return 5.42101086242752217E-20 * int64(); }
302 inline unsigned int int32() {
return (
unsigned int)int64(); }
304 unsigned long long u;
305 unsigned long long v;
306 unsigned long long w;
312 #endif //GRT_RANDOM_HEADER
VectorDouble getRandomVectorGauss(UINT numDimensions, double mu=0.0, double sigma=1.0)
double getRandomNumberGauss(double mu=0.0, double sigma=1.0)
Random(unsigned long long seed=0)
VectorDouble getRandomVectorUniform(UINT numDimensions, double minRange=0.0, double maxRange=1.0)
static unsigned long getSystemTime()
int getRandomNumberWeighted(vector< IndexedDouble > &weightedValues, vector< double > &x)
std::vector< unsigned int > getRandomSubset(const unsigned int startRange, const unsigned int endRange, const unsigned int subsetSize)
void setSeed(unsigned long long seed=0)
int getRandomNumberWeighted(const vector< int > &values, const vector< double > &weights)
int getRandomNumberWeighted(vector< IndexedDouble > weightedValues)
int getRandomNumberInt(int minRange, int maxRange)
double getRandomNumberUniform(double minRange=0.0, double maxRange=1.0)