49 lines
1.2 KiB
Rust
49 lines
1.2 KiB
Rust
use rand::rngs::StdRng;
|
|
use rand::Rng;
|
|
|
|
pub trait RandomExt<T> {
|
|
fn gen_interval(&mut self, min: T, max: T) -> T;
|
|
}
|
|
|
|
impl RandomExt<f32> for StdRng {
|
|
fn gen_interval(&mut self, min: f32, max: f32) -> f32 {
|
|
if min == max {
|
|
return min;
|
|
}
|
|
let minimum = f32::min(min, max);
|
|
let maximum = f32::max(min, max);
|
|
let diff = maximum - minimum;
|
|
let x: f32 = self.gen();
|
|
x * diff + minimum
|
|
}
|
|
}
|
|
|
|
impl RandomExt<f64> for StdRng {
|
|
fn gen_interval(&mut self, min: f64, max: f64) -> f64 {
|
|
if min == max {
|
|
return min;
|
|
}
|
|
let minimum = f64::min(min, max);
|
|
let maximum = f64::max(min, max);
|
|
let diff = maximum - minimum;
|
|
let x: f64 = self.gen();
|
|
x * diff + minimum
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod test {
|
|
use rand::prelude::StdRng;
|
|
use rand::{Rng, SeedableRng};
|
|
|
|
#[test]
|
|
fn test_gen() {
|
|
let random_seed = rand::random();
|
|
let mut rng = StdRng::seed_from_u64(random_seed);
|
|
for _ in 0..1000 {
|
|
let random_number: f64 = rng.gen();
|
|
assert!(random_number < 1.);
|
|
assert!(random_number > 0.);
|
|
}
|
|
}
|
|
}
|