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.cpp
And 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.cpp
That'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!