[core] Random Number Generator
Implement a random number generator as a thin wrapper around rand::StdRng. Provide some default seed data to get consistent random numbers.
This commit is contained in:
		
							parent
							
								
									f47654cc98
								
							
						
					
					
						commit
						6d0df32f74
					
				
					 4 changed files with 143 additions and 2 deletions
				
			
		
							
								
								
									
										99
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										99
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							|  | @ -89,6 +89,7 @@ dependencies = [ | |||
| name = "chessfriend_core" | ||||
| version = "0.1.0" | ||||
| dependencies = [ | ||||
|  "rand", | ||||
|  "thiserror", | ||||
| ] | ||||
| 
 | ||||
|  | @ -222,6 +223,18 @@ version = "1.0.0" | |||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "getrandom" | ||||
| version = "0.3.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "libc", | ||||
|  "r-efi", | ||||
|  "wasi", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "heck" | ||||
| version = "0.4.1" | ||||
|  | @ -239,9 +252,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "libc" | ||||
| version = "0.2.152" | ||||
| version = "0.2.172" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" | ||||
| checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "linux-raw-sys" | ||||
|  | @ -281,6 +294,15 @@ dependencies = [ | |||
|  "libc", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ppv-lite86" | ||||
| version = "0.2.21" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" | ||||
| dependencies = [ | ||||
|  "zerocopy", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "proc-macro2" | ||||
| version = "1.0.95" | ||||
|  | @ -299,6 +321,12 @@ dependencies = [ | |||
|  "proc-macro2", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "r-efi" | ||||
| version = "5.2.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "radix_trie" | ||||
| version = "0.2.1" | ||||
|  | @ -309,6 +337,35 @@ dependencies = [ | |||
|  "nibble_vec", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "rand" | ||||
| version = "0.9.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" | ||||
| dependencies = [ | ||||
|  "rand_chacha", | ||||
|  "rand_core", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "rand_chacha" | ||||
| version = "0.9.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" | ||||
| dependencies = [ | ||||
|  "ppv-lite86", | ||||
|  "rand_core", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "rand_core" | ||||
| version = "0.9.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" | ||||
| dependencies = [ | ||||
|  "getrandom", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "rustix" | ||||
| version = "0.38.30" | ||||
|  | @ -417,6 +474,15 @@ version = "0.2.1" | |||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "wasi" | ||||
| version = "0.14.2+wasi-0.2.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" | ||||
| dependencies = [ | ||||
|  "wit-bindgen-rt", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "winapi" | ||||
| version = "0.3.9" | ||||
|  | @ -504,3 +570,32 @@ name = "windows_x86_64_msvc" | |||
| version = "0.52.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "wit-bindgen-rt" | ||||
| version = "0.39.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" | ||||
| dependencies = [ | ||||
|  "bitflags", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "zerocopy" | ||||
| version = "0.8.25" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" | ||||
| dependencies = [ | ||||
|  "zerocopy-derive", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "zerocopy-derive" | ||||
| version = "0.8.25" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn", | ||||
| ] | ||||
|  |  | |||
|  | @ -6,4 +6,5 @@ edition = "2021" | |||
| # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||||
| 
 | ||||
| [dependencies] | ||||
| rand = "0.9.1" | ||||
| thiserror = "2" | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ | |||
| pub mod colors; | ||||
| pub mod coordinates; | ||||
| pub mod pieces; | ||||
| pub mod random; | ||||
| pub mod shapes; | ||||
| 
 | ||||
| mod macros; | ||||
|  |  | |||
							
								
								
									
										44
									
								
								core/src/random.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								core/src/random.rs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,44 @@ | |||
| // Eryn Wells <eryn@erynwells.me>
 | ||||
| 
 | ||||
| use rand::{rngs::StdRng, RngCore, SeedableRng}; | ||||
| 
 | ||||
| pub struct RandomNumberGenerator { | ||||
|     rng: StdRng, | ||||
| } | ||||
| 
 | ||||
| impl RandomNumberGenerator { | ||||
|     /// A default value for hashing chess games.
 | ||||
|     ///
 | ||||
|     /// This value is the SHA-256 hash of a PGN I downloaded from the internet
 | ||||
|     /// of the six games Kasparov played against Deep Blue in 1996.
 | ||||
|     #[rustfmt::skip] | ||||
|     const DEFAULT_SEED_VALUE: [u8; 32] = [ | ||||
|         0x22, 0x0b, 0xae, 0xd5, 0xc5, 0xb8, 0x20, 0xb1, | ||||
|         0xee, 0x05, 0x4b, 0x72, 0x73, 0x4c, 0x1a, 0xf9, | ||||
|         0xc2, 0xb7, 0x5d, 0x87, 0xc8, 0xa9, 0x44, 0x87, | ||||
|         0x01, 0xda, 0xdb, 0xe0, 0x8e, 0xf8, 0xe8, 0x77, | ||||
|     ]; | ||||
| 
 | ||||
|     #[must_use] | ||||
|     pub fn new(seed: <StdRng as SeedableRng>::Seed) -> Self { | ||||
|         let rng = StdRng::from_seed(seed); | ||||
| 
 | ||||
|         Self { rng } | ||||
|     } | ||||
| 
 | ||||
|     #[must_use] | ||||
|     pub fn rand(&mut self) -> &mut StdRng { | ||||
|         &mut self.rng | ||||
|     } | ||||
| 
 | ||||
|     pub fn next_u64(&mut self) -> u64 { | ||||
|         self.rng.next_u64() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl Default for RandomNumberGenerator { | ||||
|     fn default() -> Self { | ||||
|         let rng = StdRng::from_seed(Self::DEFAULT_SEED_VALUE); | ||||
|         Self { rng } | ||||
|     } | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue