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