This is not a tutorial, this is just what I managed to put together...
I want
- one global random engine (e.g. the mersenne twister)
- one real-value uniform distribution in the interval [0,1), let's call this function RANDOM()
- to be able to call RANDOM() from anywhere in my code.
There are three files: random.h, random.cpp and main.cpp (any additional .cpp file that includes random.h can use the function RANDOM() ).
The content of the files is as follow:
random.h
// random.h #ifndef _RND_HH_ #define _RND_HH_ #include <random> //--- FOR THIS YOU NEED c++11, enable with -std=c++11 flag // Declare engine - single instance for the whole code //extern std::mt19937 my_rng; extern std::mt19937_64 my_rng; //Declare distributions: extern std::uniform_real_distribution<double> my_unif_real_dist; //extern std::uniform_int_distribution<double> my_unif_int_dist; int Seed(int seed); double RANDOM(); #endif // end of random.hrandom.cpp
//random.cpp #include <stdio.h> #include <iostream> #include <chrono> #include "random.h" //std::mt19937 my_rng {}; std::mt19937_64 my_rng {}; // Defines an engine std::uniform_real_distribution<double> my_unif_real_dist(0., 1.); //Define distribution // Function to seed the random number generator from main file // useful if you want the seed from a parameter file // a negative value for seed gets you a random seed // outputs the seed itself int Seed(int seed) { if (seed < 0) { long rseed=static_cast<long unsigned int>(std::chrono::high_resolution_clock::now().time_since_epoch().count()); std::cerr << "Randomizing random generator, seed is "<<rseed<<std::endl; my_rng.seed(rseed); return rseed; } else { std::cerr << "User-provided seed is "<<seed<<std::endl; my_rng.seed(seed); return seed; } } // This is the function to call if you want a random number in the interval [0,1) double RANDOM(void) { return my_unif_real_dist(my_rng); } // end of random.cppAnd finally for the main.cpp file
//main.cpp #include <stdio.h> #include <iostream> #include "random.h" int main() { int max = 10; int my_seed = 235; int my_new_Seed = Seed(my_seed); for(int i=0; i<max;++i){ double one_random_number = RANDOM(); std::cerr << RANDOM() << std::endl; } }// end of main.cppThat's it! This is really all you need.
Compile it with:
g++ -std=c++11 random.cpp main.cpp -o my_pretty_random_numbers
and happy random number generation.
By the way, this seems to work fine on my machine (running Ubuntu 18).
Can this be improved in simplicity and/or performance? Are there bugs?
Please let me know!