summaryrefslogtreecommitdiffstats
path: root/vendor/rand_xorshift/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/rand_xorshift/src/lib.rs')
-rw-r--r--vendor/rand_xorshift/src/lib.rs32
1 files changed, 13 insertions, 19 deletions
diff --git a/vendor/rand_xorshift/src/lib.rs b/vendor/rand_xorshift/src/lib.rs
index 769921fca..7fb59a482 100644
--- a/vendor/rand_xorshift/src/lib.rs
+++ b/vendor/rand_xorshift/src/lib.rs
@@ -10,7 +10,7 @@
#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk.png",
html_favicon_url = "https://www.rust-lang.org/favicon.ico",
- html_root_url = "https://rust-random.github.io/rand/")]
+ html_root_url = "https://docs.rs/rand_xorshift/0.3.0")]
#![deny(missing_docs)]
#![deny(missing_debug_implementations)]
@@ -18,7 +18,7 @@
#![no_std]
use core::num::Wrapping as w;
-use core::{fmt, slice};
+use core::fmt;
use rand_core::{RngCore, SeedableRng, Error, impls, le};
#[cfg(feature="serde1")] use serde::{Serialize, Deserialize};
@@ -31,7 +31,7 @@ use rand_core::{RngCore, SeedableRng, Error, impls, le};
/// [^1]: Marsaglia, George (July 2003).
/// ["Xorshift RNGs"](https://www.jstatsoft.org/v08/i14/paper).
/// *Journal of Statistical Software*. Vol. 8 (Issue 14).
-#[derive(Clone)]
+#[derive(Clone, PartialEq, Eq)]
#[cfg_attr(feature="serde1", derive(Serialize,Deserialize))]
pub struct XorShiftRng {
x: w<u32>,
@@ -71,7 +71,8 @@ impl RngCore for XorShiftRng {
}
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> {
- Ok(self.fill_bytes(dest))
+ self.fill_bytes(dest);
+ Ok(())
}
}
@@ -98,26 +99,19 @@ impl SeedableRng for XorShiftRng {
}
fn from_rng<R: RngCore>(mut rng: R) -> Result<Self, Error> {
- let mut seed_u32 = [0u32; 4];
+ let mut b = [0u8; 16];
loop {
- unsafe {
- let ptr = seed_u32.as_mut_ptr() as *mut u8;
-
- let slice = slice::from_raw_parts_mut(ptr, 4 * 4);
- rng.try_fill_bytes(slice)?;
+ rng.try_fill_bytes(&mut b[..])?;
+ if !b.iter().all(|&x| x == 0) {
+ break;
}
- for v in seed_u32.iter_mut() {
- // enforce LE for consistency across platforms
- *v = v.to_le();
- }
- if !seed_u32.iter().all(|&x| x == 0) { break; }
}
Ok(XorShiftRng {
- x: w(seed_u32[0]),
- y: w(seed_u32[1]),
- z: w(seed_u32[2]),
- w: w(seed_u32[3]),
+ x: w(u32::from_le_bytes([b[0], b[1], b[2], b[3]])),
+ y: w(u32::from_le_bytes([b[4], b[5], b[6], b[7]])),
+ z: w(u32::from_le_bytes([b[8], b[9], b[10], b[11]])),
+ w: w(u32::from_le_bytes([b[12], b[13], b[14], b[15]])),
})
}
}