@@ -276,6 +276,7 @@ use prng::Isaac64Rng as IsaacWordRng;
276276
277277use  distributions:: { Range ,  IndependentSample } ; 
278278use  distributions:: range:: SampleRange ; 
279+ use  reseeding:: { ReseedingRng ,  ReseedWithNew } ; 
279280
280281// public modules 
281282pub  mod  distributions; 
@@ -933,58 +934,39 @@ pub fn weak_rng() -> XorShiftRng {
933934    XorShiftRng :: new ( ) . unwrap ( ) 
934935} 
935936
936- /// Controls how the thread-local RNG is reseeded. 
937- #[ cfg( feature="std" ) ]  
938- #[ derive( Debug ) ]  
939- struct  ThreadRngReseeder ; 
940- 
941- #[ cfg( feature="std" ) ]  
942- impl  reseeding:: Reseeder < StdRng >  for  ThreadRngReseeder  { 
943-     fn  reseed ( & mut  self ,  rng :  & mut  StdRng )  { 
944-         match  StdRng :: new ( )  { 
945-             Ok ( r)  => * rng = r, 
946-             Err ( e)  => panic ! ( "No entropy available: {}" ,  e) , 
947-         } 
948-     } 
949- } 
950- #[ cfg( feature="std" ) ]  
951- const  THREAD_RNG_RESEED_THRESHOLD :  u64  = 32_768 ; 
952- #[ cfg( feature="std" ) ]  
953- type  ThreadRngInner  = reseeding:: ReseedingRng < StdRng ,  ThreadRngReseeder > ; 
954937
955938/// The thread-local RNG. 
956939#[ cfg( feature="std" ) ]  
957940#[ derive( Clone ,  Debug ) ]  
958941pub  struct  ThreadRng  { 
959-     rng :  Rc < RefCell < ThreadRngInner > > , 
942+     rng :  Rc < RefCell < ReseedingRng < StdRng ,   ReseedWithNew > > > , 
960943} 
961944
962- /// Retrieve the lazily-initialized thread-local random number 
963- /// generator, seeded by the system. Intended to be used in method 
964- /// chaining style, e.g. `thread_rng().gen::<i32>()`. 
965- /// 
966- /// After generating a certain amount of randomness, the RNG will reseed itself 
967- /// from the operating system or, if the operating system RNG returns an error, 
968- /// a seed based on the current system time. 
969- /// 
970- /// The internal RNG used is platform and architecture dependent, even 
971- /// if the operating system random number generator is rigged to give 
972- /// the same sequence always. If absolute consistency is required, 
973- /// explicitly select an RNG, e.g. `IsaacRng` or `Isaac64Rng`. 
974945#[ cfg( feature="std" ) ]  
975- pub   fn   thread_rng ( )  ->  ThreadRng   { 
976-     // used to make space in TLS for a random number generator 
977-     thread_local ! ( static   THREAD_RNG_KEY :   Rc < RefCell < ThreadRngInner >>  = { 
946+ thread_local ! ( 
947+     static   THREAD_RNG_KEY :   Rc < RefCell < ReseedingRng < StdRng ,   ReseedWithNew >>> =  { 
948+          const   THREAD_RNG_RESEED_THRESHOLD :   u64  = 32_768 ; 
978949        let  r = match  StdRng :: new( )  { 
979950            Ok ( r)  => r, 
980-             Err ( e)  => panic!( "No entropy available : {}" ,  e) , 
951+             Err ( e)  => panic!( "could not initialize thread_rng : {:? }" ,  e) 
981952        } ; 
982-         let  rng = reseeding :: ReseedingRng :: new( r, 
983-                                                 THREAD_RNG_RESEED_THRESHOLD , 
984-                                                 ThreadRngReseeder ) ; 
953+         let  rng = ReseedingRng :: new( r, 
954+                                     THREAD_RNG_RESEED_THRESHOLD , 
955+                                     ReseedWithNew ) ; 
985956        Rc :: new( RefCell :: new( rng) ) 
986-     } ) ; 
957+     } 
958+ ) ; 
987959
960+ /// Retrieve the lazily-initialized thread-local random number 
961+ /// generator, seeded by the system. Intended to be used in method 
962+ /// chaining style, e.g. `thread_rng().gen::<i32>()`. 
963+ /// 
964+ /// The internal RNG used is the one defined by `StdRng`. After generating 32KiB 
965+ /// of random bytes, the RNG will reseed itself from the operating system or, if 
966+ /// the operating system RNG returns an error, the `JitterRng` entropy 
967+ /// collector. 
968+ #[ cfg( feature="std" ) ]  
969+ pub  fn  thread_rng ( )  -> ThreadRng  { 
988970    ThreadRng  {  rng :  THREAD_RNG_KEY . with ( |t| t. clone ( ) )  } 
989971} 
990972
0 commit comments