about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKevin Ballard <kevin@sb.org>2013-08-16 12:11:34 -0700
committerKevin Ballard <kevin@sb.org>2013-08-16 12:11:34 -0700
commite7b8524b3d9e37a45e56d38f158c27b9d4234ba7 (patch)
tree5baff943b1a3a473fd1c197da789f11e88ebee30
parent680eb71564ebba5e76ce1e1a8287b30042332cc5 (diff)
downloadrust-e7b8524b3d9e37a45e56d38f158c27b9d4234ba7.tar.gz
rust-e7b8524b3d9e37a45e56d38f158c27b9d4234ba7.zip
Give XorShiftRng::new() a random seed
Fixes #8359.
-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 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])
     }
 
     /**