10
10
11
11
//! The ISAAC random number generator.
12
12
13
- use rand:: { seed, Rng , SeedableRng } ;
13
+ use cast;
14
+ use rand:: { Rng , SeedableRng , OSRng } ;
14
15
use iter:: { Iterator , range, range_step, Repeat } ;
15
16
use option:: { None , Some } ;
16
17
@@ -29,23 +30,31 @@ pub struct IsaacRng {
29
30
priv b: u32 ,
30
31
priv c: u32
31
32
}
33
+ static EMPTY : IsaacRng = IsaacRng {
34
+ cnt : 0 ,
35
+ rsl : [ 0 , .. RAND_SIZE ] ,
36
+ mem : [ 0 , .. RAND_SIZE ] ,
37
+ a : 0 , b : 0 , c : 0
38
+ } ;
32
39
33
40
impl IsaacRng {
34
41
/// Create an ISAAC random number generator with a random seed.
35
42
pub fn new ( ) -> IsaacRng {
36
- let s = unsafe { seed :: < u32 > ( RAND_SIZE as uint ) } ;
37
- SeedableRng :: from_seed ( s. as_slice ( ) )
43
+ let mut rng = EMPTY ;
44
+
45
+ {
46
+ let bytes = unsafe { cast:: transmute :: < & mut [ u32 ] , & mut [ u8 ] > ( rng. rsl ) } ;
47
+ OSRng :: new ( ) . fill_bytes ( bytes) ;
48
+ }
49
+
50
+ rng. init ( true ) ;
51
+ rng
38
52
}
39
53
40
54
/// Create an ISAAC random number generator using the default
41
55
/// fixed seed.
42
56
pub fn new_unseeded ( ) -> IsaacRng {
43
- let mut rng = IsaacRng {
44
- cnt : 0 ,
45
- rsl : [ 0 , .. RAND_SIZE ] ,
46
- mem : [ 0 , .. RAND_SIZE ] ,
47
- a : 0 , b : 0 , c : 0
48
- } ;
57
+ let mut rng = EMPTY ;
49
58
rng. init ( false ) ;
50
59
rng
51
60
}
@@ -193,15 +202,8 @@ impl<'self> SeedableRng<&'self [u32]> for IsaacRng {
193
202
/// constructed with a given seed will generate the same sequence
194
203
/// of values as all other generators constructed with that seed.
195
204
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
-
205
+ let mut rng = EMPTY ;
203
206
rng. reseed ( seed) ;
204
-
205
207
rng
206
208
}
207
209
}
@@ -224,23 +226,30 @@ pub struct Isaac64Rng {
224
226
priv c: u64 ,
225
227
}
226
228
229
+ static EMPTY_64 : Isaac64Rng = Isaac64Rng {
230
+ cnt : 0 ,
231
+ rsl : [ 0 , .. RAND_SIZE_64 ] ,
232
+ mem : [ 0 , .. RAND_SIZE_64 ] ,
233
+ a : 0 , b : 0 , c : 0 ,
234
+ } ;
235
+
227
236
impl Isaac64Rng {
228
237
/// Create a 64-bit ISAAC random number generator with a random
229
238
/// seed.
230
239
pub fn new ( ) -> Isaac64Rng {
231
- let s = unsafe { seed :: < u64 > ( RAND_SIZE_64 ) } ;
232
- SeedableRng :: from_seed ( s. as_slice ( ) )
240
+ let mut rng = EMPTY_64 ;
241
+ {
242
+ let bytes = unsafe { cast:: transmute :: < & mut [ u64 ] , & mut [ u8 ] > ( rng. rsl ) } ;
243
+ OSRng :: new ( ) . fill_bytes ( bytes) ;
244
+ }
245
+ rng. init ( true ) ;
246
+ rng
233
247
}
234
248
235
249
/// Create a 64-bit ISAAC random number generator using the
236
250
/// default fixed seed.
237
251
pub fn new_unseeded ( ) -> Isaac64Rng {
238
- let mut rng = Isaac64Rng {
239
- cnt : 0 ,
240
- rsl : [ 0 , .. RAND_SIZE_64 ] ,
241
- mem : [ 0 , .. RAND_SIZE_64 ] ,
242
- a : 0 , b : 0 , c : 0 ,
243
- } ;
252
+ let mut rng = EMPTY_64 ;
244
253
rng. init ( false ) ;
245
254
rng
246
255
}
@@ -388,12 +397,7 @@ impl<'self> SeedableRng<&'self [u64]> for Isaac64Rng {
388
397
/// constructed with a given seed will generate the same sequence
389
398
/// of values as all other generators constructed with that seed.
390
399
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
- } ;
400
+ let mut rng = EMPTY_64 ;
397
401
rng. reseed ( seed) ;
398
402
rng
399
403
}
@@ -402,21 +406,21 @@ impl<'self> SeedableRng<&'self [u64]> for Isaac64Rng {
402
406
#[ cfg( test) ]
403
407
mod test {
404
408
use super :: * ;
405
- use rand:: { Rng , SeedableRng , seed } ;
409
+ use rand:: { Rng , SeedableRng , OSRng } ;
406
410
use option:: Some ;
407
411
use iter:: range;
408
412
use vec;
409
413
410
414
#[ test]
411
415
fn test_rng_32_rand_seeded ( ) {
412
- let s = unsafe { seed :: < u32 > ( 256 ) } ;
416
+ let s = OSRng :: new ( ) . gen_vec :: < u32 > ( 256 ) ;
413
417
let mut ra: IsaacRng = SeedableRng :: from_seed ( s. as_slice ( ) ) ;
414
418
let mut rb: IsaacRng = SeedableRng :: from_seed ( s. as_slice ( ) ) ;
415
419
assert_eq ! ( ra. gen_ascii_str( 100 u) , rb. gen_ascii_str( 100 u) ) ;
416
420
}
417
421
#[ test]
418
422
fn test_rng_64_rand_seeded ( ) {
419
- let s = unsafe { seed :: < u64 > ( 256 ) } ;
423
+ let s = OSRng :: new ( ) . gen_vec :: < u64 > ( 256 ) ;
420
424
let mut ra: Isaac64Rng = SeedableRng :: from_seed ( s. as_slice ( ) ) ;
421
425
let mut rb: Isaac64Rng = SeedableRng :: from_seed ( s. as_slice ( ) ) ;
422
426
assert_eq ! ( ra. gen_ascii_str( 100 u) , rb. gen_ascii_str( 100 u) ) ;
@@ -439,7 +443,7 @@ mod test {
439
443
440
444
#[ test]
441
445
fn test_rng_32_reseed ( ) {
442
- let s = unsafe { seed :: < u32 > ( 256 ) } ;
446
+ let s = OSRng :: new ( ) . gen_vec :: < u32 > ( 256 ) ;
443
447
let mut r: IsaacRng = SeedableRng :: from_seed ( s. as_slice ( ) ) ;
444
448
let string1 = r. gen_ascii_str ( 100 ) ;
445
449
@@ -450,7 +454,7 @@ mod test {
450
454
}
451
455
#[ test]
452
456
fn test_rng_64_reseed ( ) {
453
- let s = unsafe { seed :: < u64 > ( 256 ) } ;
457
+ let s = OSRng :: new ( ) . gen_vec :: < u64 > ( 256 ) ;
454
458
let mut r: Isaac64Rng = SeedableRng :: from_seed ( s. as_slice ( ) ) ;
455
459
let string1 = r. gen_ascii_str ( 100 ) ;
456
460
0 commit comments