@@ -126,6 +126,13 @@ impl Xoroshiro {
126126 self . hi = m. rotate_left ( 28 ) ;
127127 n
128128 }
129+
130+ pub const fn next_splitter ( & mut self ) -> XoroshiroSplitter {
131+ XoroshiroSplitter {
132+ lo : self . next_random ( ) ,
133+ hi : self . next_random ( ) ,
134+ }
135+ }
129136}
130137
131138impl GaussianGenerator for Xoroshiro {
@@ -160,10 +167,7 @@ impl RandomImpl for Xoroshiro {
160167 }
161168
162169 fn next_splitter ( & mut self ) -> RandomDeriver {
163- RandomDeriver :: Xoroshiro ( XoroshiroSplitter {
164- lo : self . next_random ( ) ,
165- hi : self . next_random ( ) ,
166- } )
170+ RandomDeriver :: Xoroshiro ( self . next_splitter ( ) )
167171 }
168172
169173 fn next_i32 ( & mut self ) -> i32 {
@@ -220,25 +224,36 @@ pub struct XoroshiroSplitter {
220224 hi : u64 ,
221225}
222226
223- impl RandomDeriverImpl for XoroshiroSplitter {
224- fn split_string ( & self , seed : & str ) -> RandomGenerator {
227+ impl XoroshiroSplitter {
228+ #[ must_use]
229+ pub fn split_string ( & self , seed : & str ) -> Xoroshiro {
225230 let bytes = md5:: compute ( seed. as_bytes ( ) ) ;
226231 let l = u64:: from_be_bytes ( bytes[ 0 ..8 ] . try_into ( ) . expect ( "incorrect length" ) ) ;
227232 let m = u64:: from_be_bytes ( bytes[ 8 ..16 ] . try_into ( ) . expect ( "incorrect length" ) ) ;
228233
229- RandomGenerator :: Xoroshiro ( Xoroshiro :: new ( l ^ self . lo , m ^ self . hi ) )
234+ Xoroshiro :: new ( l ^ self . lo , m ^ self . hi )
235+ }
236+
237+ #[ must_use]
238+ pub fn split_pos ( & self , x : i32 , y : i32 , z : i32 ) -> Xoroshiro {
239+ let l = hash_block_pos ( x, y, z) as u64 ;
240+ let m = l ^ self . lo ;
241+
242+ Xoroshiro :: new ( m, self . hi )
243+ }
244+ }
245+
246+ impl RandomDeriverImpl for XoroshiroSplitter {
247+ fn split_string ( & self , seed : & str ) -> RandomGenerator {
248+ RandomGenerator :: Xoroshiro ( self . split_string ( seed) )
230249 }
231250
232251 fn split_u64 ( & self , seed : u64 ) -> RandomGenerator {
233252 RandomGenerator :: Xoroshiro ( Xoroshiro :: new ( seed ^ self . lo , seed ^ self . hi ) )
234253 }
235254
236- #[ expect( clippy:: many_single_char_names) ]
237255 fn split_pos ( & self , x : i32 , y : i32 , z : i32 ) -> RandomGenerator {
238- let l = hash_block_pos ( x, y, z) as u64 ;
239- let m = l ^ self . lo ;
240-
241- RandomGenerator :: Xoroshiro ( Xoroshiro :: new ( m, self . hi ) )
256+ RandomGenerator :: Xoroshiro ( self . split_pos ( x, y, z) )
242257 }
243258}
244259
0 commit comments