Search code examples
c++randommersenne-twister

Create random integer in range from random double


I get random double number [0,1) from mersenne twister. How would I get random [0,x) from mersenne twister output?

Mersenne twister outputs either random integer in total range or random [0,1)

It is important that it is evenly distributed, so I doubt that basic floor(mersenneRandom()*x) will do.

if it does, then great.


Solution

  • Another case for your favorite reference!

    #include <random>
    #include <iostream>
    
    
    
    int main()
    {
        std::random_device rd;
        std::mt19937 gen(rd());
        std::uniform_real_distribution<> dis(1, 2);
        for (int n = 0; n < 10; ++n) {
            std::cout << dis(gen) << ' ';
        }
        std::cout << '\n';
    }
    

    (taken from here) generates values in [1,2), and the site explains how to do it for arbitrary [a,b)!

    If you need integers, use std::uniform_int_distribution.

    floor(mersenneRandom()*x) does indeed not work because the difference between a double-value and the next greater one becomes greater than one for big numbers. You would skip all integers between those two values.