RaceNG/
lib.rs

1//! RaceRNG, innovative new way of designing RNG
2
3use std::thread;
4use std::sync::mpsc;
5use std::time::Instant;
6
7///The function will randomly decide between x and y numbers using a race condition
8pub fn race(x: i32, y: i32) -> i32 {
9    let mut z = 0;
10
11    let (tx1, rx1) = mpsc::channel();
12    let (tx2, rx2) = mpsc::channel();
13
14    thread::spawn(move || {
15        loop {
16            tx1.send(x);
17            let slowdown = generate_primes(2000);
18        }
19    });
20    thread::spawn(move || {
21        loop {
22            tx2.send(y);
23            let slowdown = generate_primes(2000);
24        }
25    });
26
27    let mut now = Instant::now();
28    loop {
29        match rx1.try_recv() {
30            Ok(v) => {z = v},
31            Err(_) => ()
32        }
33        match time_check(&mut now, z) {
34            Some(v) => {return v}
35            None => (),
36        }
37        
38        match rx2.try_recv() {
39            Ok(v) => {z = v},
40            Err(_) => ()
41        }
42        match time_check(&mut now, z) {
43            Some(v) => {return v}
44            None => (),
45        }
46    }
47}
48
49fn generate_primes(n: usize) -> Vec<usize> {
50    let mut primes: Vec<usize> = Vec::new();
51
52    let count = 3;
53    loop {
54        let magic = ((count as f32).sqrt().round()) as usize + 1;
55        for i in 2..magic {
56            if count % i == 0 {
57                break
58            }
59            primes.push(count);
60        }
61
62        if primes.len() > n {
63            return primes;
64        }
65    }
66}
67
68fn time_check(now: &mut Instant, z: i32) -> Option<i32>{
69    let elapsed = now.elapsed();
70    if elapsed.as_millis() > 300 {
71        *now = Instant::now();
72        return Some(z)
73    }
74
75    return None;
76}