compiled and logically correct

This commit is contained in:
Joshua Perry 2024-08-14 01:58:08 +01:00
commit 0e84820a4a
1 changed files with 68 additions and 0 deletions

68
src/main.rs Normal file
View File

@ -0,0 +1,68 @@
use gpu_rand::xoroshiro::{rand_core::RngCore, Xoshiro256PlusPlus};
use rayon::prelude::*;
use std::time::{Duration, Instant};
const MINS: u64 = 60;
const HOURS: u64 = 60 * MINS;
const DAYS: u64 = 24* HOURS;
fn main() -> anyhow::Result<()> {
let total_iterations = 1000000000; //Number of times to run
let rng_states = Xoshiro256PlusPlus::initialize_states(1234, total_iterations); //Create 1 RNG per iteration
//Same seed, offset to ensure independance
let timer = Instant::now(); //Capture instant the process starts
let result = rng_states.into_par_iter() //Multi-threaded iteration
.map(|rng| { //Replace each RNG with it's result
(0..231).into_iter() //Roll dice 232 times
.reduce(|count, _| //Reduce all dice rolls to a total of value 4 results
match roll_dice(rng) {
0 => count + 1 , //Increment count if 4 is rolled
_ => 0 , //Reset count to ensure value 4 rolls are consecutive
}
).unwrap()
}).max() //Reduce all iteration results to the highest result
.unwrap();
let timer = TimerResult::from_duration(timer.elapsed()); //Capture duration of elapsed time
//since timer creation
let days = timer.days;
let hours = timer.hours;
let minutes = timer.minutes;
let seconds = timer.seconds;
Ok(println!("Highest number of Ones: {result} (completed in {days} days, {hours} hours, {minutes} minutes, and {seconds} seconds)"))
}
fn roll_dice(mut rng: Xoshiro256PlusPlus) -> u64 {
rng.next_u64() % 4
}
struct TimerResult {
days: u64,
hours: u64,
minutes: u64,
seconds: u64,
}
impl TimerResult {
fn from_duration(duration: Duration) -> Self {
let duration = duration.as_secs();
let days = duration / DAYS;
let duration = duration % DAYS;
let hours = (duration % DAYS) / HOURS;
let duration = duration % HOURS;
let minutes = duration / MINS;
let seconds = duration % MINS / MINS;
Self {
days,
hours,
minutes,
seconds,
}
}
}