[Issue 14312] New: std.random unittest has intermittent failure

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Fri Mar 20 08:16:37 PDT 2015


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

          Issue ID: 14312
           Summary: std.random unittest has intermittent failure
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: Phobos
          Assignee: nobody at puremagic.com
          Reporter: hsteoh at quickfur.ath.cx

>From the autotester:

------
****** FAIL release64 std.random
core.exception.AssertError at std/random.d(2994): 99: 4700 < 4700.
----------------
generated/linux/release/64/unittest/libphobos2-ut.so(void
std.random.__unittestL2739_32()+0xe682) [0x2ae3d8e08efe]
generated/linux/release/64/unittest/libphobos2-ut.so(void
std.random.__modtest()+0x7c) [0x2ae3d8e7c950]
generated/linux/release/64/unittest/test_runner() [0x401361]
generated/linux/release/64/unittest/libphobos2-ut.so(runModuleUnitTests+0xe1)
[0x2ae3d9c96d51]
generated/linux/release/64/unittest/libphobos2-ut.so(void
rt.dmain2._d_run_main(int, char**, extern (C) int
function(char[][])*).runAll()+0x17) [0x2ae3d9cb97bf]
generated/linux/release/64/unittest/libphobos2-ut.so(void
rt.dmain2._d_run_main(int, char**, extern (C) int
function(char[][])*).tryExec(scope void delegate())+0x2d) [0x2ae3d9cb9775]
generated/linux/release/64/unittest/libphobos2-ut.so(_d_run_main+0x1ec)
[0x2ae3d9cb96ec]
generated/linux/release/64/unittest/test_runner() [0x401567]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x2ae3da64fec5]
make[1]: *** [unittest/std/random.run] Error 1
make[1]: *** Waiting for unfinished jobs....
5.458s PASS release64 std.datetime
7.936s PASS release64 std.parallelism
make[1]: Leaving directory
`/home/braddr/sandbox/at-client/pull-1467374-Linux_64_64/phobos'
make: *** [unittest-release] Error 2
------

Looking at the code, the offending line is buried deep inside a unittest:

------
            /* Statistical assumptions here: this is a sequential sampling
process
             * so (i) 0 can only be the first sample point, so _can't_ be in
the
             * remainder of the sample after .popFront() is called. (ii) By
similar
             * token, 1 can only be in the remainder if it's the 2nd point of
the
             * whole sample, and hence if 0 was the first; probability of 0
being
             * first and 1 second is 5/100 * 4/99 (thank you, Algorithm S:-)
and
             * so the mean count of 1 should be about 202.  Finally, 99 can
only
             * be the _last_ sample point to be picked, so its probability of
             * inclusion should be independent of the .popFront() and it should
             * occur with frequency 5/100, hence its count should be about
5000.
             * Unfortunately we have to set quite a high tolerance because with
             * sample size small enough for unittests to run in reasonable
time,
             * the variance can be quite high.
             */
            assert(count0 == 0);
            assert(count1 < 300, text("1: ", count1, " > 300."));
            assert(4_700 < count99, text("99: ", count99, " < 4700.")); // <---
FAILURE HERE
            assert(count99 < 5_300, text("99: ", count99, " > 5300."));
------

The comment about statistical assumptions appear to be contradicted by the test
results. Unfortunately I do not have the RNG know-how to understand what went
wrong here. This bug is not easy to reproduce, since it depends on the exact
sequence of random numbers generated by the RNG being tested.

--


More information about the Digitalmars-d-bugs mailing list