///|
/// A small deterministic PRNG used only for reproducible fixtures and examples.
pub struct ParkMiller {
mut state : Int
}
///|
pub fn ParkMiller::new(seed : Int) -> Result[ParkMiller, DetectError] {
if seed <= 0 || seed >= 2147483647 {
return Err(InvalidRunLengthLimit)
}
Ok({ state: seed, })
}
///|
pub fn ParkMiller::next_unit(self : ParkMiller) -> Double {
self.state = self.state * 48271 % 2147483647
self.state.to_double() / 2147483647.0
}
///|
/// Generate a piecewise-constant series with deterministic uniform jitter.
pub fn piecewise_constant(
lengths : Array[Int],
means : Array[Double],
half_width : Double,
seed : Int,
) -> Result[Array[Double], DetectError] {
if lengths.length() == 0 ||
lengths.length() != means.length() ||
!finite(half_width) ||
half_width < 0.0 {
return Err(InvalidRunLengthLimit)
}
let rng = ParkMiller::new(seed).unwrap()
let result : Array[Double] = []
for index in 0..