|
1 | 1 | use std::ops::{Add, Sub}; |
2 | 2 |
|
3 | | -use rand::{thread_rng, Rng}; |
4 | | -use rand_distr::Uniform; |
| 3 | +use num_traits::{NumCast, ToPrimitive}; |
| 4 | +use rand::distr::uniform::Error as UniformError; |
| 5 | +use rand::distr::Uniform; |
| 6 | +use rand::{rng, Rng}; |
5 | 7 |
|
6 | 8 | // random array that samples between min and max of T |
7 | 9 | pub fn get_random_array<T>(n: usize, min_value: T, max_value: T) -> Vec<T> |
8 | 10 | where |
9 | | - T: Copy + rand::distributions::uniform::SampleUniform, |
| 11 | + T: Copy + rand::distr::uniform::SampleUniform + ToPrimitive + NumCast, |
10 | 12 | { |
11 | | - let rng = thread_rng(); |
12 | | - let uni = Uniform::new_inclusive(min_value, max_value); |
13 | | - let arr: Vec<T> = rng.sample_iter(uni).take(n).collect(); |
14 | | - arr |
| 13 | + let rng = rng(); |
| 14 | + match Uniform::new_inclusive(min_value, max_value) { |
| 15 | + Ok(uni) => rng.sample_iter(uni).take(n).collect(), |
| 16 | + Err(UniformError::NonFinite) => { |
| 17 | + let min = min_value |
| 18 | + .to_f64() |
| 19 | + .expect("failed to convert lower bound to f64"); |
| 20 | + let max = max_value |
| 21 | + .to_f64() |
| 22 | + .expect("failed to convert upper bound to f64"); |
| 23 | + let uni = Uniform::new_inclusive(min, max).unwrap(); |
| 24 | + rng.sample_iter(uni) |
| 25 | + .take(n) |
| 26 | + .map(|v| NumCast::from(v).expect("failed to convert sample")) |
| 27 | + .collect() |
| 28 | + } |
| 29 | + Err(err) => panic!("invalid range for random array: {err:?}"), |
| 30 | + } |
15 | 31 | } |
16 | 32 |
|
17 | 33 | // worst case array that alternates between increasing max and decreasing min values |
|
0 commit comments