Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extern crate rand;
- extern crate rayon;
- use rand::{
- distributions::{Distribution, Uniform},
- thread_rng,
- };
- use rayon::prelude::*;
- use std::f64::consts::PI;
- fn buffon(number: usize, length: f64, spacing: f64) -> usize {
- assert!(length > 0.0);
- assert!(spacing > 0.0);
- let center = length / 2.0;
- let angles = Uniform::new_inclusive(0.0, PI / 2.0);
- let positions = Uniform::new_inclusive(0.0, spacing / 2.0);
- (0..number)
- .into_par_iter()
- .map(|_| {
- let mut r = thread_rng();
- let a = angles.sample(&mut r);
- let p = positions.sample(&mut r);
- (a, p)
- })
- .filter(|&(a, p)| p < center * a.cos())
- .count()
- }
- fn main() {
- let number = 4_000_000;
- let length = 2.0;
- let spacing = 4.0;
- println!("--------------------------");
- println!("Simulador Agulha de Buffon");
- println!("--------------------------");
- println!("Nr. Agulhas: {}", number);
- println!("Comprimento: {}", length);
- println!("Espaçamento: {}", spacing);
- println!("--------------------------");
- let hits = buffon(number, length, spacing);
- let pi = number as f64 / hits as f64;
- println!(" Resultado: {}", hits);
- println!(" Estimativa: {:.8}", pi);
- println!(" Erro Total: {:+.4e}", pi - PI);
- println!("--------------------------");
- }
Add Comment
Please, Sign In to add comment