[Bug libstdc++/64351] New: std::uniform_real_distribution<float>(0, 1) returns 1

info at jmeng dot de gcc-bugzilla@gcc.gnu.org
Thu Dec 18 16:08:00 GMT 2014


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64351

            Bug ID: 64351
           Summary: std::uniform_real_distribution<float>(0, 1) returns 1
           Product: gcc
           Version: 3.3.6
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: info at jmeng dot de

I'm seeing std::uniform_real_distribution<float>(0, 1) return 1 even though the
standard seems to say it shouldn't:


"A uniform_real_distribution random number distribution produces random numbers
x, a ≤ x < b"

(I looked at the draft available here: http://www.open-std.org/JTC1/SC22/WG21/
or specifically here:
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011/n3242.pdf)

There is a relatively minimal working example you can try here:

http://coliru.stacked-crooked.com/a/4ca5b4ac05e990ff

Or, if you prefer to see the code directly:

// This program outputs 1, but uniform_real_distribution is supposed
// to return values in [0, 1) (the half open interval).
#include <random>
#include <cstdint>
#include <iostream>

int main()
{
    std::mt19937 rng(8890);
    std::uniform_real_distribution<float> dist;

    uint64_t num_1 = 0;
    for (uint64_t i = 0; i < 39975715; ++i)
    {
        if (dist(rng) == 1.f) 
            ++num_1;
    }

    std::cout << num_1 << std::endl;
    return 0;
}

Note that there is a related note in this bug report: 

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43660#c2


More information about the Gcc-bugs mailing list