# Random number generator

## Generic use

TRIQS comes with a set of random number generators implemented in the class random_generator. Here’s an example illustrating the use of the generator:

#include <iostream>
#include <triqs/mc_tools/random_generator.hpp>

int main() {

// Construct a random number generator
triqs::mc_tools::random_generator RNG("mt19937", 23432);

// Generate double numbers in [0,1[
for (int i = 0; i < 100; i++) std::cout << RNG() << " ";
std::cout << std::endl << std::endl;

// Generate double numbers in [0,5[
for (int i = 0; i < 100; i++) std::cout << RNG(5.0) << " ";
std::cout << std::endl << std::endl;

// Generate int numbers in [0,5[
for (int i = 0; i < 100; i++) std::cout << RNG(5) << " ";
std::cout << std::endl << std::endl;
}


After having included the header <triqs/mc_tools/random_generator.hpp> one constructs a random generator with:

triqs::mc_tools::random_generator RNG("mt19937", 23432);


The first argument is a string which allows you to select the generator. Here mt19937 stands for a version of a Mersenne Twister. The second argument is the random seed.

Now that you have an instance of a generator RNG, you can generate either double numbers or int numbers. If RNG() is just called with parenthesis, it produces numbers uniformly distributed on the interval $$[0,1[$$. If there is a double argument D, then numbers are produced uniformly on $$[0,D]$$. Finally, if there is a int argument I, integer numbers are generated on $$[0,I[$$.

## Getting a list of random number generators

In order to have a list of all the strings describing the available random generators, you can call the static method random_generator_names. For example:

#include <iostream>
#include <triqs/mc_tools/random_generator.hpp>

int main() {
std::cout << "A list of all random generators" << std::endl << std::endl;
std::cout << triqs::mc_tools::random_generator::random_generator_names() << std::endl;
}


## Accessing the random number generator from the Monte Carlo class

When you construct an instance of a Monte Carlo class mc_generic, this instance automatically has an access to a random number generator. Imagine you constructed an instance:

triqs::mc_tools::mc_generic<double> SpinMC(n_cycles, length_cycle, n_warmup_cycles,
random_name, random_seed, verbosity);


Now, you can use SpinMC to have a random number generator:

triqs::mc_tools::random_generator RNG = SpinMC.get_rng();


Typically, this generator will be passed as a argument to your implementation of a move:

SpinMC.add_move(mymove(config, SpinMC.rng(), ...), "my move")