Generating number (0,1) using mersenne twister c++

user3508622 picture user3508622 · Apr 7, 2014 · Viewed 27.2k times · Source

I'm working on implementing R code into C++ so that it runs faster, but I am having difficulties implementing mersenne twister. I only wish to generate values between (0,1). Here is what I have that pertains to this question.

#include <random>

std::mt19937 generator (123);

std::cout << "Random value: " << generator() << std:: endl;

I tried dividing by RAND_MAX, but that did not produce the values that I was looking for.

Thanks in advance.

Answer

sbabbi picture sbabbi · Apr 7, 2014

In C++11 the concepts of "(pseudo) random generator" and "probability distribution" are separated, and for good reasons.

What you want can be achieved with the following lines:

  std::mt19937 generator (123);
  std::uniform_real_distribution<double> dis(0.0, 1.0);

  double randomRealBetweenZeroAndOne = dis(generator);

If you want to understand why this separation is necessary, and why using a standard division /range manipulation on the output of the generator is a bad idea, watch this video.