www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 15147] New: std.random.uniform return value depends on

https://issues.dlang.org/show_bug.cgi?id=15147

          Issue ID: 15147
           Summary: std.random.uniform return value depends on integer
                    size
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: phobos
          Assignee: nobody puremagic.com
          Reporter: thecybershadow gmail.com

With an RNG seeded with a constant value, uniform(0, 100) and uniform(0, 100L)
will return different values.

Demonstration:

////////////////// test.d //////////////////
import std.random;
import std.stdio;

void test(T)()
{
    Mt19937 rng;
    foreach (n; 0..10)
        write(uniform(0, T(100), rng), " ");
    writeln();
}

void main()
{
    test!int();
    test!uint();
    test!long();
    test!ulong();
}
////////////////////////////////////////////

This will print:

12 2 34 85 4 91 29 85 98 3
12 2 34 85 4 91 29 85 98 3
54 49 75 69 11 25 66 64 28 18
54 49 75 69 11 25 66 64 28 18

This can be a problem for applications that expect seeded RNGs to behave
predictably on all platforms (e.g. to generate something procedurally than must
be in sync), and pass a size_t to uniform. E.g.:

string sample = arr[uniform(0, $, rng)];

--
Oct 03 2015