compiled and logically correct
This commit is contained in:
commit
0e84820a4a
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue