Skip to content

Commit 087027e

Browse files
committed
---
yaml --- r: 95280 b: refs/heads/dist-snap c: 92725ae h: refs/heads/master v: v3
1 parent 724c9cc commit 087027e

File tree

9 files changed

+233
-114
lines changed

9 files changed

+233
-114
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ refs/heads/try: c274a6888410ce3e357e014568b43310ed787d36
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c
9-
refs/heads/dist-snap: 0223cf65e41cc1046b306dcd0e3959a20729e0cf
9+
refs/heads/dist-snap: 92725ae765a75b139d5d5fc27305f4436dbb456e
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503
1212
refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0

branches/dist-snap/src/libextra/bitv.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1524,8 +1524,8 @@ mod tests {
15241524
}
15251525

15261526
fn rng() -> rand::IsaacRng {
1527-
let seed = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
1528-
rand::IsaacRng::new_seeded(seed)
1527+
let seed = &[1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
1528+
rand::SeedableRng::from_seed(seed)
15291529
}
15301530

15311531
#[bench]

branches/dist-snap/src/libextra/treemap.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1013,7 +1013,7 @@ mod test_treemap {
10131013
check_equal(ctrl, &map);
10141014
assert!(map.find(&5).is_none());
10151015

1016-
let mut rng = rand::IsaacRng::new_seeded(&[42]);
1016+
let mut rng: rand::IsaacRng = rand::SeedableRng::from_seed(&[42]);
10171017

10181018
do 3.times {
10191019
do 90.times {

branches/dist-snap/src/libstd/rand/isaac.rs

Lines changed: 133 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,10 @@
1010

1111
//! The ISAAC random number generator.
1212
13-
use rand::{seed, Rng};
14-
use iter::{Iterator, range, range_step};
13+
use rand::{seed, Rng, SeedableRng};
14+
use iter::{Iterator, range, range_step, Repeat};
1515
use option::{None, Some};
1616

17-
use cast;
18-
use cmp;
19-
use sys;
20-
use vec;
21-
2217
static RAND_SIZE_LEN: u32 = 8;
2318
static RAND_SIZE: u32 = 1 << RAND_SIZE_LEN;
2419

@@ -38,30 +33,8 @@ pub struct IsaacRng {
3833
impl IsaacRng {
3934
/// Create an ISAAC random number generator with a random seed.
4035
pub fn new() -> IsaacRng {
41-
IsaacRng::new_seeded(seed(RAND_SIZE as uint * 4))
42-
}
43-
44-
/// Create an ISAAC random number generator with a seed. This can be any
45-
/// length, although the maximum number of bytes used is 1024 and any more
46-
/// will be silently ignored. A generator constructed with a given seed
47-
/// will generate the same sequence of values as all other generators
48-
/// constructed with the same seed.
49-
pub fn new_seeded(seed: &[u8]) -> IsaacRng {
50-
let mut rng = IsaacRng {
51-
cnt: 0,
52-
rsl: [0, .. RAND_SIZE],
53-
mem: [0, .. RAND_SIZE],
54-
a: 0, b: 0, c: 0
55-
};
56-
57-
let array_size = sys::size_of_val(&rng.rsl);
58-
let copy_length = cmp::min(array_size, seed.len());
59-
60-
// manually create a &mut [u8] slice of randrsl to copy into.
61-
let dest = unsafe { cast::transmute((&mut rng.rsl, array_size)) };
62-
vec::bytes::copy_memory(dest, seed, copy_length);
63-
rng.init(true);
64-
rng
36+
let s = unsafe {seed::<u32>(RAND_SIZE as uint)};
37+
SeedableRng::from_seed(s.as_slice())
6538
}
6639

6740
/// Create an ISAAC random number generator using the default
@@ -197,6 +170,43 @@ impl Rng for IsaacRng {
197170
}
198171
}
199172

173+
impl<'self> SeedableRng<&'self [u32]> for IsaacRng {
174+
fn reseed(&mut self, seed: &'self [u32]) {
175+
// make the seed into [seed[0], seed[1], ..., seed[seed.len()
176+
// - 1], 0, 0, ...], to fill rng.rsl.
177+
let seed_iter = seed.iter().map(|&x| x).chain(Repeat::new(0u32));
178+
179+
for (rsl_elem, seed_elem) in self.rsl.mut_iter().zip(seed_iter) {
180+
*rsl_elem = seed_elem;
181+
}
182+
self.cnt = 0;
183+
self.a = 0;
184+
self.b = 0;
185+
self.c = 0;
186+
187+
self.init(true);
188+
}
189+
190+
/// Create an ISAAC random number generator with a seed. This can
191+
/// be any length, although the maximum number of elements used is
192+
/// 256 and any more will be silently ignored. A generator
193+
/// constructed with a given seed will generate the same sequence
194+
/// of values as all other generators constructed with that seed.
195+
fn from_seed(seed: &'self [u32]) -> IsaacRng {
196+
let mut rng = IsaacRng {
197+
cnt: 0,
198+
rsl: [0, .. RAND_SIZE],
199+
mem: [0, .. RAND_SIZE],
200+
a: 0, b: 0, c: 0
201+
};
202+
203+
rng.reseed(seed);
204+
205+
rng
206+
}
207+
}
208+
209+
200210
static RAND_SIZE_64_LEN: uint = 8;
201211
static RAND_SIZE_64: uint = 1 << RAND_SIZE_64_LEN;
202212

@@ -218,31 +228,8 @@ impl Isaac64Rng {
218228
/// Create a 64-bit ISAAC random number generator with a random
219229
/// seed.
220230
pub fn new() -> Isaac64Rng {
221-
Isaac64Rng::new_seeded(seed(RAND_SIZE_64 as uint * 8))
222-
}
223-
224-
/// Create a 64-bit ISAAC random number generator with a
225-
/// seed. This can be any length, although the maximum number of
226-
/// bytes used is 2048 and any more will be silently ignored. A
227-
/// generator constructed with a given seed will generate the same
228-
/// sequence of values as all other generators constructed with
229-
/// the same seed.
230-
pub fn new_seeded(seed: &[u8]) -> Isaac64Rng {
231-
let mut rng = Isaac64Rng {
232-
cnt: 0,
233-
rsl: [0, .. RAND_SIZE_64],
234-
mem: [0, .. RAND_SIZE_64],
235-
a: 0, b: 0, c: 0,
236-
};
237-
238-
let array_size = sys::size_of_val(&rng.rsl);
239-
let copy_length = cmp::min(array_size, seed.len());
240-
241-
// manually create a &mut [u8] slice of randrsl to copy into.
242-
let dest = unsafe { cast::transmute((&mut rng.rsl, array_size)) };
243-
vec::bytes::copy_memory(dest, seed, copy_length);
244-
rng.init(true);
245-
rng
231+
let s = unsafe {seed::<u64>(RAND_SIZE_64)};
232+
SeedableRng::from_seed(s.as_slice())
246233
}
247234

248235
/// Create a 64-bit ISAAC random number generator using the
@@ -378,52 +365,118 @@ impl Rng for Isaac64Rng {
378365
}
379366
}
380367

368+
impl<'self> SeedableRng<&'self [u64]> for Isaac64Rng {
369+
fn reseed(&mut self, seed: &'self [u64]) {
370+
// make the seed into [seed[0], seed[1], ..., seed[seed.len()
371+
// - 1], 0, 0, ...], to fill rng.rsl.
372+
let seed_iter = seed.iter().map(|&x| x).chain(Repeat::new(0u64));
373+
374+
for (rsl_elem, seed_elem) in self.rsl.mut_iter().zip(seed_iter) {
375+
*rsl_elem = seed_elem;
376+
}
377+
self.cnt = 0;
378+
self.a = 0;
379+
self.b = 0;
380+
self.c = 0;
381+
382+
self.init(true);
383+
}
384+
385+
/// Create an ISAAC random number generator with a seed. This can
386+
/// be any length, although the maximum number of elements used is
387+
/// 256 and any more will be silently ignored. A generator
388+
/// constructed with a given seed will generate the same sequence
389+
/// of values as all other generators constructed with that seed.
390+
fn from_seed(seed: &'self [u64]) -> Isaac64Rng {
391+
let mut rng = Isaac64Rng {
392+
cnt: 0,
393+
rsl: [0, .. RAND_SIZE_64],
394+
mem: [0, .. RAND_SIZE_64],
395+
a: 0, b: 0, c: 0,
396+
};
397+
rng.reseed(seed);
398+
rng
399+
}
400+
}
401+
381402
#[cfg(test)]
382403
mod test {
383404
use super::*;
384-
use rand::{Rng, seed};
385-
use option::{Option, Some};
405+
use rand::{Rng, SeedableRng, seed};
406+
use option::Some;
407+
use iter::range;
408+
use vec;
386409

387410
#[test]
388411
fn test_rng_seeded() {
389-
let seed = seed(1024);
390-
let mut ra = IsaacRng::new_seeded(seed);
391-
let mut rb = IsaacRng::new_seeded(seed);
412+
let s = unsafe {seed::<u32>(256)};
413+
let mut ra: IsaacRng = SeedableRng::from_seed(s.as_slice());
414+
let mut rb: IsaacRng = SeedableRng::from_seed(s.as_slice());
392415
assert_eq!(ra.gen_ascii_str(100u), rb.gen_ascii_str(100u));
393416

394-
let seed = seed(2048);
395-
let mut ra = Isaac64Rng::new_seeded(seed);
396-
let mut rb = Isaac64Rng::new_seeded(seed);
417+
let s = unsafe {seed::<u64>(256)};
418+
let mut ra: Isaac64Rng = SeedableRng::from_seed(s.as_slice());
419+
let mut rb: Isaac64Rng = SeedableRng::from_seed(s.as_slice());
397420
assert_eq!(ra.gen_ascii_str(100u), rb.gen_ascii_str(100u));
398421
}
399422

400423
#[test]
401424
fn test_rng_seeded_custom_seed() {
402425
// much shorter than generated seeds which are 1024 & 2048
403426
// bytes resp.
404-
let seed = [2u8, 32u8, 4u8, 32u8, 51u8];
405-
let mut ra = IsaacRng::new_seeded(seed);
406-
let mut rb = IsaacRng::new_seeded(seed);
427+
let seed = &[2, 32, 4, 32, 51];
428+
let mut ra: IsaacRng = SeedableRng::from_seed(seed);
429+
let mut rb: IsaacRng = SeedableRng::from_seed(seed);
407430
assert_eq!(ra.gen_ascii_str(100u), rb.gen_ascii_str(100u));
408431

409-
let mut ra = Isaac64Rng::new_seeded(seed);
410-
let mut rb = Isaac64Rng::new_seeded(seed);
432+
let seed = &[2, 32, 4, 32, 51];
433+
let mut ra: Isaac64Rng = SeedableRng::from_seed(seed);
434+
let mut rb: Isaac64Rng = SeedableRng::from_seed(seed);
411435
assert_eq!(ra.gen_ascii_str(100u), rb.gen_ascii_str(100u));
412436
}
413437

414438
#[test]
415-
fn test_rng_seeded_custom_seed2() {
416-
let seed = [2u8, 32u8, 4u8, 32u8, 51u8];
417-
let mut ra = IsaacRng::new_seeded(seed);
439+
fn test_rng_32_true_values() {
440+
let seed = &[2, 32, 4, 32, 51];
441+
let mut ra: IsaacRng = SeedableRng::from_seed(seed);
418442
// Regression test that isaac is actually using the above vector
419-
let r = ra.next_u32();
420-
error2!("{:?}", r);
421-
assert_eq!(r, 2935188040u32);
422-
423-
let mut ra = Isaac64Rng::new_seeded(seed);
443+
let v = vec::from_fn(10, |_| ra.next_u32());
444+
assert_eq!(v,
445+
~[447462228, 2081944040, 3163797308, 2379916134, 2377489184,
446+
1132373754, 536342443, 2995223415, 1265094839, 345325140]);
447+
448+
let seed = &[500, -4000, 123456, 9876543, 1, 1, 1, 1, 1];
449+
let mut rb: IsaacRng = SeedableRng::from_seed(seed);
450+
// skip forward to the 10000th number
451+
for _ in range(0, 10000) { rb.next_u32(); }
452+
453+
let v = vec::from_fn(10, |_| rb.next_u32());
454+
assert_eq!(v,
455+
~[612373032, 292987903, 1819311337, 3141271980, 422447569,
456+
310096395, 1083172510, 867909094, 2478664230, 2073577855]);
457+
}
458+
#[test]
459+
fn test_rng_64_true_values() {
460+
let seed = &[2, 32, 4, 32, 51];
461+
let mut ra: Isaac64Rng = SeedableRng::from_seed(seed);
424462
// Regression test that isaac is actually using the above vector
425-
let r = ra.next_u64();
426-
error2!("{:?}", r);
427-
assert!(r == 0 && r == 1); // FIXME: find true value
463+
let v = vec::from_fn(10, |_| ra.next_u64());
464+
assert_eq!(v,
465+
~[15015576812873463115, 12461067598045625862, 14818626436142668771,
466+
5562406406765984441, 11813289907965514161, 13443797187798420053,
467+
6935026941854944442, 7750800609318664042, 14428747036317928637,
468+
14028894460301215947]);
469+
470+
let seed = &[500, -4000, 123456, 9876543, 1, 1, 1, 1, 1];
471+
let mut rb: Isaac64Rng = SeedableRng::from_seed(seed);
472+
// skip forward to the 10000th number
473+
for _ in range(0, 10000) { rb.next_u64(); }
474+
475+
let v = vec::from_fn(10, |_| rb.next_u64());
476+
assert_eq!(v,
477+
~[13557216323596688637, 17060829581390442094, 4927582063811333743,
478+
2699639759356482270, 4819341314392384881, 6047100822963614452,
479+
11086255989965979163, 11901890363215659856, 5370800226050011580,
480+
16496463556025356451]);
428481
}
429482
}

0 commit comments

Comments
 (0)