54 lines
1.6 KiB
Rust
54 lines
1.6 KiB
Rust
use rand::random;
|
||
|
||
const SAMPLE_SIZE: usize = 5_000;
|
||
|
||
fn simpson_from_uniform(m: i32, a: i32, r: f32) -> f32 {
|
||
if r <= 0.5 {
|
||
let d = (2f32 * r).sqrt() / 0.2;
|
||
(m - a) as f32 + d
|
||
} else {
|
||
let d = (2f32 * (1f32 - r)).sqrt() / 0.2;
|
||
(m + a) as f32 - d
|
||
}
|
||
}
|
||
|
||
fn mean(distribution: &[f32]) -> f32 {
|
||
distribution.iter().sum::<f32>() / distribution.len() as f32
|
||
}
|
||
|
||
fn dispersion(mean: f32, distribution: &[f32]) -> f32 {
|
||
distribution
|
||
.iter()
|
||
.map(|x| (*x - mean).powi(2))
|
||
.sum::<f32>()
|
||
/ distribution.len() as f32
|
||
}
|
||
|
||
fn standard_deviation(mean: f32, distribution: &[f32]) -> f32 {
|
||
dispersion(mean, distribution).sqrt()
|
||
}
|
||
|
||
fn probability_in_limits(lower: f32, upper: f32, distribution: &[f32]) -> f32 {
|
||
distribution
|
||
.iter()
|
||
.filter(|x| **x > lower && **x < upper)
|
||
.count() as f32
|
||
/ distribution.len() as f32
|
||
}
|
||
|
||
fn main() {
|
||
let set_m = 20;
|
||
let set_a = 5;
|
||
let simpson_numbers: Vec<f32> = (0..=SAMPLE_SIZE)
|
||
.map(|_| simpson_from_uniform(set_m, set_a, random::<f32>()))
|
||
.collect();
|
||
|
||
let m = mean(&simpson_numbers);
|
||
let std_dev = standard_deviation(m, &simpson_numbers);
|
||
let probability = probability_in_limits(17f32, 24f32, &simpson_numbers);
|
||
|
||
println!("Математичне очікування розподілу: {m}");
|
||
println!("Середньоквадратичне відхилення розподілу: {std_dev}");
|
||
println!("Ймовірність потрапляння у проміжок [17; 24]: {probability}");
|
||
}
|