@@ -300,20 +300,30 @@ pub trait SeedableRng: Sized {
300
300
/// considered a value-breaking change.
301
301
fn seed_from_u64 ( mut state : u64 ) -> Self {
302
302
// We use PCG32 to generate a u32 sequence, and copy to the seed
303
- const MUL : u64 = 6364136223846793005 ;
304
- const INC : u64 = 11634580027462260723 ;
303
+ fn pcg32 ( state : & mut u64 ) -> [ u8 ; 4 ] {
304
+ const MUL : u64 = 6364136223846793005 ;
305
+ const INC : u64 = 11634580027462260723 ;
305
306
306
- let mut seed = Self :: Seed :: default ( ) ;
307
- for chunk in seed. as_mut ( ) . chunks_mut ( 4 ) {
308
307
// We advance the state first (to get away from the input value,
309
308
// in case it has low Hamming Weight).
310
- state = state. wrapping_mul ( MUL ) . wrapping_add ( INC ) ;
309
+ * state = state. wrapping_mul ( MUL ) . wrapping_add ( INC ) ;
310
+ let state = * state;
311
311
312
312
// Use PCG output function with to_le to generate x:
313
313
let xorshifted = ( ( ( state >> 18 ) ^ state) >> 27 ) as u32 ;
314
314
let rot = ( state >> 59 ) as u32 ;
315
315
let x = xorshifted. rotate_right ( rot) ;
316
- chunk. copy_from_slice ( & x. to_le_bytes ( ) ) ;
316
+ x. to_le_bytes ( )
317
+ }
318
+
319
+ let mut seed = Self :: Seed :: default ( ) ;
320
+ let mut iter = seed. as_mut ( ) . chunks_exact_mut ( 4 ) ;
321
+ for chunk in & mut iter {
322
+ chunk. copy_from_slice ( & pcg32 ( & mut state) ) ;
323
+ }
324
+ let rem = iter. into_remainder ( ) ;
325
+ if !rem. is_empty ( ) {
326
+ rem. copy_from_slice ( & pcg32 ( & mut state) [ ..rem. len ( ) ] ) ;
317
327
}
318
328
319
329
Self :: from_seed ( seed)
0 commit comments