File tree Expand file tree Collapse file tree 1 file changed +60
-0
lines changed
Expand file tree Collapse file tree 1 file changed +60
-0
lines changed Original file line number Diff line number Diff line change 1+ //! # Random Number Generator
2+
3+ /// see <https://en.wikipedia.org/wiki/Xorshift>
4+ ///
5+ /// # Example
6+ /// ```
7+ /// use std::time::{SystemTime, UNIX_EPOCH};
8+ /// use programming_team_code_rust::helpers::untested_rng::UntestedRNG;
9+ ///
10+ /// // fixed seed for debugging
11+ /// let mut rng1 = UntestedRNG::new(12345);
12+ /// // for submitting
13+ /// let mut rng2 = UntestedRNG::new(
14+ /// SystemTime::now()
15+ /// .duration_since(UNIX_EPOCH)
16+ /// .unwrap()
17+ /// .subsec_nanos() as u64,
18+ /// );
19+ ///
20+ /// assert_eq!(rng1.get(), 13289605635609);
21+ /// assert_eq!(rng1.get_in_range(-3..4), 0);
22+ /// ```
23+ struct UntestedRNG {
24+ state : u64 ,
25+ }
26+
27+ impl UntestedRNG {
28+ /// Creates a new RNG
29+ ///
30+ /// # Complexity
31+ /// - Time: O(1)
32+ /// - Space: O(1)
33+ fn new ( seed : u64 ) -> Self {
34+ assert_ne ! ( seed, 0 ) ;
35+ Self { state : seed }
36+ }
37+
38+ /// Gets a new random number
39+ ///
40+ /// # Complexity
41+ /// - Time: O(1)
42+ /// - Space: O(1)
43+ fn get ( & mut self ) -> u64 {
44+ let mut x = self . state ;
45+ x ^= x << 13 ;
46+ x ^= x >> 7 ;
47+ x ^= x << 17 ;
48+ self . state = x;
49+ x
50+ }
51+
52+ /// Gets a new random number in range
53+ ///
54+ /// # Complexity
55+ /// - Time: O(1)
56+ /// - Space: O(1)
57+ fn get_in_range ( & mut self , range : std:: ops:: Range < i64 > ) -> i64 {
58+ range. start + ( self . get ( ) % ( range. end - range. start ) as u64 ) as i64
59+ }
60+ }
You can’t perform that action at this time.
0 commit comments