use crate::QuantumRNG;
pub struct MonteCarloSimulator {
quantum_rng: QuantumRNG,
}
impl MonteCarloSimulator {
pub fn new() -> Self {
MonteCarloSimulator {
quantum_rng: QuantumRNG::new(),
}
}
pub fn run_simulation<F>(&mut self, num_samples: usize, mut simulation_func: F) -> f64
where
F: FnMut(f64) -> f64,
{
let mut sum = 0.0;
for _ in 0..num_samples {
let sample = self.quantum_rng.generate_random_number();
sum += simulation_func(sample);
}
sum / num_samples as f64
}
pub fn simulate_option_pricing(&mut self, strike: f64, spot: f64, rate: f64, volatility: f64, time: f64) -> f64 {
let mut sum = 0.0;
let num_samples = 10000;
for _ in 0..num_samples {
let drift = (rate - 0.5 * volatility * volatility) * time;
let diffusion = volatility * (time.sqrt()) * self.normal_random();
let final_price = spot * (drift + diffusion).exp();
sum += (final_price - strike).max(0.0);
}
(sum / num_samples as f64) * (-rate * time).exp()
}
fn normal_random(&mut self) -> f64 {
let u1 = self.quantum_rng.generate_random_number();
let u2 = self.quantum_rng.generate_random_number();
(-2.0 * u1.ln()).sqrt() * (2.0 * std::f64::consts::PI * u2).cos()
}
}
pub fn simulate(iterations: u32) -> f64 {
let mut simulator = MonteCarloSimulator::new();
simulator.run_simulation(iterations as usize, |x| x)
}
pub type MonteCarloSimulation = MonteCarloSimulator;