|
10 | 10 |
|
11 | 11 | //! The ISAAC random number generator.
|
12 | 12 |
|
13 |
| -use cast; |
14 | 13 | use rand::{Rng, SeedableRng, OSRng};
|
15 | 14 | use iter::{Iterator, range, range_step, Repeat};
|
16 | 15 | use option::{None, Some};
|
| 16 | +use vec::raw; |
| 17 | +use mem; |
17 | 18 |
|
18 | 19 | static RAND_SIZE_LEN: u32 = 8;
|
19 | 20 | static RAND_SIZE: u32 = 1 << RAND_SIZE_LEN;
|
@@ -42,9 +43,12 @@ impl IsaacRng {
|
42 | 43 | pub fn new() -> IsaacRng {
|
43 | 44 | let mut rng = EMPTY;
|
44 | 45 |
|
45 |
| - { |
46 |
| - let bytes = unsafe {cast::transmute::<&mut [u32], &mut [u8]>(rng.rsl)}; |
47 |
| - OSRng::new().fill_bytes(bytes); |
| 46 | + unsafe { |
| 47 | + let ptr = raw::to_mut_ptr(rng.rsl); |
| 48 | + |
| 49 | + do raw::mut_buf_as_slice(ptr as *mut u8, mem::size_of_val(&rng.rsl)) |slice| { |
| 50 | + OSRng::new().fill_bytes(slice); |
| 51 | + } |
48 | 52 | }
|
49 | 53 |
|
50 | 54 | rng.init(true);
|
@@ -238,10 +242,15 @@ impl Isaac64Rng {
|
238 | 242 | /// seed.
|
239 | 243 | pub fn new() -> Isaac64Rng {
|
240 | 244 | let mut rng = EMPTY_64;
|
241 |
| - { |
242 |
| - let bytes = unsafe {cast::transmute::<&mut [u64], &mut [u8]>(rng.rsl)}; |
243 |
| - OSRng::new().fill_bytes(bytes); |
| 245 | + |
| 246 | + unsafe { |
| 247 | + let ptr = raw::to_mut_ptr(rng.rsl); |
| 248 | + |
| 249 | + do raw::mut_buf_as_slice(ptr as *mut u8, mem::size_of_val(&rng.rsl)) |slice| { |
| 250 | + OSRng::new().fill_bytes(slice); |
| 251 | + } |
244 | 252 | }
|
| 253 | + |
245 | 254 | rng.init(true);
|
246 | 255 | rng
|
247 | 256 | }
|
@@ -434,14 +443,14 @@ mod test {
|
434 | 443 |
|
435 | 444 | #[test]
|
436 | 445 | fn test_rng_32_seeded() {
|
437 |
| - let seed = &[2, 32, 4, 32, 51]; |
| 446 | + let seed = &[1, 23, 456, 7890, 12345]; |
438 | 447 | let mut ra: IsaacRng = SeedableRng::from_seed(seed);
|
439 | 448 | let mut rb: IsaacRng = SeedableRng::from_seed(seed);
|
440 | 449 | assert_eq!(ra.gen_ascii_str(100u), rb.gen_ascii_str(100u));
|
441 | 450 | }
|
442 | 451 | #[test]
|
443 | 452 | fn test_rng_64_seeded() {
|
444 |
| - let seed = &[2, 32, 4, 32, 51]; |
| 453 | + let seed = &[1, 23, 456, 7890, 12345]; |
445 | 454 | let mut ra: Isaac64Rng = SeedableRng::from_seed(seed);
|
446 | 455 | let mut rb: Isaac64Rng = SeedableRng::from_seed(seed);
|
447 | 456 | assert_eq!(ra.gen_ascii_str(100u), rb.gen_ascii_str(100u));
|
@@ -472,46 +481,46 @@ mod test {
|
472 | 481 |
|
473 | 482 | #[test]
|
474 | 483 | fn test_rng_32_true_values() {
|
475 |
| - let seed = &[2, 32, 4, 32, 51]; |
| 484 | + let seed = &[1, 23, 456, 7890, 12345]; |
476 | 485 | let mut ra: IsaacRng = SeedableRng::from_seed(seed);
|
477 | 486 | // Regression test that isaac is actually using the above vector
|
478 | 487 | let v = vec::from_fn(10, |_| ra.next_u32());
|
479 | 488 | assert_eq!(v,
|
480 |
| - ~[447462228, 2081944040, 3163797308, 2379916134, 2377489184, |
481 |
| - 1132373754, 536342443, 2995223415, 1265094839, 345325140]); |
| 489 | + ~[2558573138, 873787463, 263499565, 2103644246, 3595684709, |
| 490 | + 4203127393, 264982119, 2765226902, 2737944514, 3900253796]); |
482 | 491 |
|
483 |
| - let seed = &[500, -4000, 123456, 9876543, 1, 1, 1, 1, 1]; |
| 492 | + let seed = &[12345, 67890, 54321, 9876]; |
484 | 493 | let mut rb: IsaacRng = SeedableRng::from_seed(seed);
|
485 | 494 | // skip forward to the 10000th number
|
486 | 495 | for _ in range(0, 10000) { rb.next_u32(); }
|
487 | 496 |
|
488 | 497 | let v = vec::from_fn(10, |_| rb.next_u32());
|
489 | 498 | assert_eq!(v,
|
490 |
| - ~[612373032, 292987903, 1819311337, 3141271980, 422447569, |
491 |
| - 310096395, 1083172510, 867909094, 2478664230, 2073577855]); |
| 499 | + ~[3676831399, 3183332890, 2834741178, 3854698763, 2717568474, |
| 500 | + 1576568959, 3507990155, 179069555, 141456972, 2478885421]); |
492 | 501 | }
|
493 | 502 | #[test]
|
494 | 503 | fn test_rng_64_true_values() {
|
495 |
| - let seed = &[2, 32, 4, 32, 51]; |
| 504 | + let seed = &[1, 23, 456, 7890, 12345]; |
496 | 505 | let mut ra: Isaac64Rng = SeedableRng::from_seed(seed);
|
497 | 506 | // Regression test that isaac is actually using the above vector
|
498 | 507 | let v = vec::from_fn(10, |_| ra.next_u64());
|
499 | 508 | assert_eq!(v,
|
500 |
| - ~[15015576812873463115, 12461067598045625862, 14818626436142668771, |
501 |
| - 5562406406765984441, 11813289907965514161, 13443797187798420053, |
502 |
| - 6935026941854944442, 7750800609318664042, 14428747036317928637, |
503 |
| - 14028894460301215947]); |
| 509 | + ~[547121783600835980, 14377643087320773276, 17351601304698403469, |
| 510 | + 1238879483818134882, 11952566807690396487, 13970131091560099343, |
| 511 | + 4469761996653280935, 15552757044682284409, 6860251611068737823, |
| 512 | + 13722198873481261842]); |
504 | 513 |
|
505 |
| - let seed = &[500, -4000, 123456, 9876543, 1, 1, 1, 1, 1]; |
| 514 | + let seed = &[12345, 67890, 54321, 9876]; |
506 | 515 | let mut rb: Isaac64Rng = SeedableRng::from_seed(seed);
|
507 | 516 | // skip forward to the 10000th number
|
508 | 517 | for _ in range(0, 10000) { rb.next_u64(); }
|
509 | 518 |
|
510 | 519 | let v = vec::from_fn(10, |_| rb.next_u64());
|
511 | 520 | assert_eq!(v,
|
512 |
| - ~[13557216323596688637, 17060829581390442094, 4927582063811333743, |
513 |
| - 2699639759356482270, 4819341314392384881, 6047100822963614452, |
514 |
| - 11086255989965979163, 11901890363215659856, 5370800226050011580, |
515 |
| - 16496463556025356451]); |
| 521 | + ~[18143823860592706164, 8491801882678285927, 2699425367717515619, |
| 522 | + 17196852593171130876, 2606123525235546165, 15790932315217671084, |
| 523 | + 596345674630742204, 9947027391921273664, 11788097613744130851, |
| 524 | + 10391409374914919106]); |
516 | 525 | }
|
517 | 526 | }
|
0 commit comments