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")