@@ -15,7 +15,11 @@ use std::{
1515
1616use bytemuck:: allocation:: cast_vec;
1717use ecow:: { eco_vec, EcoVec } ;
18- use rand:: prelude:: * ;
18+ use rand_xoshiro:: {
19+ rand_core:: { RngCore , SeedableRng } ,
20+ Xoshiro256Plus ,
21+ } ;
22+
1923#[ cfg( not( target_arch = "wasm32" ) ) ]
2024use rayon:: prelude:: * ;
2125use smallvec:: SmallVec ;
@@ -2112,7 +2116,7 @@ impl Value {
21122116 let mut hasher = DefaultHasher :: new ( ) ;
21132117 seed. hash ( & mut hasher) ;
21142118 let seed = hasher. finish ( ) ;
2115- let mut rng = SmallRng :: seed_from_u64 ( seed) ;
2119+ let mut rng = Xoshiro256Plus :: seed_from_u64 ( seed) ;
21162120
21172121 const SHAPE_REQ : & str = "Shape must be an array of natural \
21182122 numbers with at most rank 2";
@@ -2122,7 +2126,7 @@ impl Value {
21222126 let elem_count = validate_size :: < f64 > ( shape. iter ( ) . copied ( ) , env) ?;
21232127 let mut data = eco_vec ! [ 0.0 ; elem_count] ;
21242128 for x in data. make_mut ( ) {
2125- * x = rng. gen ( ) ;
2129+ * x = f64 :: from_bits ( rng. next_u64 ( ) ) ;
21262130 }
21272131 Ok ( Array :: new ( shape, data) )
21282132 } ;
@@ -2168,7 +2172,15 @@ impl Value {
21682172 0 => Err ( env. error ( "Cannot pick random row of an empty array" ) . fill ( ) ) ,
21692173 1 => Ok ( self . row ( 0 ) ) ,
21702174 len => {
2171- let i = RNG . with_borrow_mut ( |rng| rng. gen_range ( 0 ..len) ) ;
2175+ let i = RNG . with_borrow_mut ( |rng| {
2176+ let upper = len. next_power_of_two ( ) ;
2177+ loop {
2178+ let r = rng. next_u64 ( ) as usize ;
2179+ if r % upper < len {
2180+ break len;
2181+ }
2182+ }
2183+ } ) ;
21722184 Ok ( self . row ( i) )
21732185 }
21742186 }
0 commit comments