commit 0e84820a4a3d2b3c369c0b30a685e9241cd299b6 Author: r0r-5chach Date: Wed Aug 14 01:58:08 2024 +0100 compiled and logically correct diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..fc8bf94 --- /dev/null +++ b/src/main.rs @@ -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, + } + } +}