about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-08-18 10:01:55 -0700
committerbors <bors@rust-lang.org>2013-08-18 10:01:55 -0700
commit88bd2155d780d2d7d976ff271b6bb25a9b03e119 (patch)
tree0706de0f0b8342d9069eceab52eab76e60842bc4 /src/libstd
parent0a238288d343fc6323b37aad8678b3ea701fb7e3 (diff)
parente7b8524b3d9e37a45e56d38f158c27b9d4234ba7 (diff)
downloadrust-88bd2155d780d2d7d976ff271b6bb25a9b03e119.tar.gz
rust-88bd2155d780d2d7d976ff271b6bb25a9b03e119.zip
auto merge of #8558 : kballard/rust/xorshift-seed, r=cmr
Fixes #8359.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/rand.rs21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/libstd/rand.rs b/src/libstd/rand.rs
index 9e53c596656..35c7380e311 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])
     }
 
     /**