From e7b8524b3d9e37a45e56d38f158c27b9d4234ba7 Mon Sep 17 00:00:00 2001 From: Kevin Ballard Date: Fri, 16 Aug 2013 12:11:34 -0700 Subject: Give XorShiftRng::new() a random seed Fixes #8359. --- src/libstd/rand.rs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'src/libstd') diff --git a/src/libstd/rand.rs b/src/libstd/rand.rs index bd2ea1d6ac6..30763bc34fc 100644 --- a/src/libstd/rand.rs +++ b/src/libstd/rand.rs @@ -875,13 +875,22 @@ impl Rng for XorShiftRng { } impl XorShiftRng { - /// Create an xor shift random number generator with a default seed. + /// Create an xor shift random number generator with a random seed. pub fn new() -> XorShiftRng { - // constants taken from http://en.wikipedia.org/wiki/Xorshift - XorShiftRng::new_seeded(123456789u32, - 362436069u32, - 521288629u32, - 88675123u32) + // generate seeds the same way as seed(), except we have a spceific size + let mut s = [0u8, ..16]; + loop { + do s.as_mut_buf |p, sz| { + unsafe { + rustrt::rand_gen_seed(p, sz as size_t); + } + } + if !s.iter().all(|x| *x == 0) { + break; + } + } + let s: &[u32, ..4] = unsafe { cast::transmute(&s) }; + XorShiftRng::new_seeded(s[0], s[1], s[2], s[3]) } /** -- cgit 1.4.1-3-g733a5