Sebastian Lenartowicz Sebastian Lenartowicz - 1 year ago 95
C++ Question

std::mt19937 and std::uniform_real_distribution returning boundary value every time

OK, so I've got some RNG code that (when all is said and done) boils down to this:

#include <limits>
#include <random>
#include <chrono>
#include <iostream>

double randomValue() {
// Seed a Mersenne Twister (good RNG) with the current system time
std::mt19937 generator(std::chrono::system_clock::now().time_since_epoch().count());

std::uniform_real_distribution<double> dist(

// Problem lives here
for (unsigned int i = 0; i < 30; i++)
std::cout << dist(generator) << "\n";

The output from this is 30 lines of
. Why?

Compiling with
Debian 4.9.2-10, using
and no other flags. And, before anyone else comments on it, I'm using the built-in Mersenne Twister-based RNG because my application requires high-quality random numbers, and seeding it with the system time (so no, it's not just the same seed over and over again).

Answer Source

According to C++14 section paragraph 2:

Requires: a ≤ b and b − a ≤ numeric_limits<RealType>::max().

In your case, b-a is greater than the allowed range.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download