[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:
Eryn Wells 2025-06-02 15:44:38 -07:00
parent f47654cc98
commit 6d0df32f74
4 changed files with 143 additions and 2 deletions

99
Cargo.lock generated
View file

@ -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",
]

View file

@ -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"

View file

@ -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
View 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 }
}
}