@@ -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 ;
@@ -2110,7 +2114,7 @@ impl Value {
21102114 let mut hasher = DefaultHasher :: new ( ) ;
21112115 seed. hash ( & mut hasher) ;
21122116 let seed = hasher. finish ( ) ;
2113- let mut rng = SmallRng :: seed_from_u64 ( seed) ;
2117+ let mut rng = Xoshiro256Plus :: seed_from_u64 ( seed) ;
21142118
21152119 const SHAPE_REQ : & str = "Shape must be an array of natural \
21162120 numbers with at most rank 2";
@@ -2120,7 +2124,7 @@ impl Value {
21202124 let elem_count = validate_size :: < f64 > ( shape. iter ( ) . copied ( ) , env) ?;
21212125 let mut data = eco_vec ! [ 0.0 ; elem_count] ;
21222126 for x in data. make_mut ( ) {
2123- * x = rng. gen ( ) ;
2127+ * x = f64 :: from_bits ( rng. next_u64 ( ) ) ;
21242128 }
21252129 Ok ( Array :: new ( shape, data) )
21262130 } ;
@@ -2166,7 +2170,15 @@ impl Value {
21662170 0 => Err ( env. error ( "Cannot pick random row of an empty array" ) . fill ( ) ) ,
21672171 1 => Ok ( self . row ( 0 ) ) ,
21682172 len => {
2169- let i = RNG . with_borrow_mut ( |rng| rng. gen_range ( 0 ..len) ) ;
2173+ let i = RNG . with_borrow_mut ( |rng| {
2174+ let upper = len. next_power_of_two ( ) ;
2175+ loop {
2176+ let r = rng. next_u64 ( ) as usize ;
2177+ if r % upper < len {
2178+ break len;
2179+ }
2180+ }
2181+ } ) ;
21702182 Ok ( self . row ( i) )
21712183 }
21722184 }
0 commit comments