use rand::Rng;
use crate::Number;
use super::Term;
pub struct RandomTerm<T: Number>
{
min: Box<dyn Term<T> + Send + Sync>,
max: Box<dyn Term<T> + Send + Sync>
}
impl<T: Number> RandomTerm<T>
{
pub fn new(min: Box<dyn Term<T> + Send + Sync>, max: Box<dyn Term<T> + Send + Sync>) -> RandomTerm<T>
{
return RandomTerm {min, max};
}
}
impl<T: Number> Term<T> for RandomTerm<T>
{
fn evaluate(&self, t: T) -> T
{
let mut rng = rand::thread_rng();
let minimum = self.min.evaluate(t).to_f64().expect("Unable to convert generic type to f64 for random generation.");
let maximum = self.max.evaluate(t).to_f64().expect("Unable to convert generic type to f64 for random generation.");
if minimum >= maximum
{
panic!("Minimum is not smaller than maximum when attempting to generate a random value in parametrized RandomTerm.");
}
let random = rng.gen_range(minimum..maximum);
return T::from_f64(random).expect("Unable to convert f64 to generic type after random generation.");
}
}