If the user calls srandomdev(), they are asking for an unpredictable sequence, even one that could not normally be produced. So give them one. Use arc4random in that case.
Index: stdlib/random.c =================================================================== RCS file: /cvs/src/lib/libc/stdlib/random.c,v retrieving revision 1.22 diff -u -p -r1.22 random.c --- stdlib/random.c 15 Jun 2014 05:10:58 -0000 1.22 +++ stdlib/random.c 13 Jul 2014 13:56:34 -0000 @@ -176,6 +176,8 @@ static int rand_type = TYPE_3; static int rand_deg = DEG_3; static int rand_sep = SEP_3; +static int use_arc4random; + _THREAD_PRIVATE_MUTEX(random); static long random_l(void); @@ -201,6 +203,7 @@ srandom_l(unsigned int x) int32_t test; div_t val; + use_arc4random = 0; if (rand_type == TYPE_0) state[0] = x; else { @@ -254,17 +257,7 @@ srandomdev(void) size_t len; LOCK(); - if (rand_type == TYPE_0) - len = sizeof(state[0]); - else - len = rand_deg * sizeof(state[0]); - - arc4random_buf(state, len); - - if (rand_type != TYPE_0) { - fptr = &state[rand_sep]; - rptr = &state[0]; - } + use_arc4random = 1; UNLOCK(); } @@ -411,6 +404,9 @@ static long random_l(void) { int32_t i; + + if (use_arc4random) + return arc4random() & 0x7fffffff; if (rand_type == TYPE_0) i = state[0] = (state[0] * 1103515245 + 12345) & 0x7fffffff;