Bug 14312 – std.random unittest has intermittent failure
Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P1
Component
phobos
Product
D
Version
D2
Platform
All
OS
All
Creation time
2015-03-20T15:16:37Z
Last change time
2018-03-31T17:47:49Z
Assigned to
No Owner
Creator
hsteoh
Comments
Comment #0 by hsteoh — 2015-03-20T15:16:37Z
From the autotester:
------
****** FAIL release64 std.random
core.exception.AssertError@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.
Comment #1 by greensunny12 — 2018-03-31T17:47:49Z
I haven't seen this in the last two years, so I assume its fixed.