# Alex Kladov - On Random Numbers (Highlights) ![rw-book-cover|256](https://readwise-assets.s3.amazonaws.com/static/images/article1.be68295a7e40.png) ## Highlights - In Rust, [`getrandom`](https://lib.rs/getrandom) crate provides a cross-platform wrapper for this functionality. ([View Highlight](https://read.readwise.io/read/01gpsfnvrgfxhxx5xkjdcekrwc)) ^456172522 - There are many different algorithms to do that. [`fastrand`](https://lib.rs/fastrand) crate implements something sufficiently close to the state of the art. ([View Highlight](https://read.readwise.io/read/01gpsfq5y7fv0v1t84tv5eaywr)) ^456172858 - Alternatively, a good-enough PRNG can be implemented in 9 lines of code: ([View Highlight](https://read.readwise.io/read/01gpsfr6wnsfka72k0v43nwk08)) ^456173188 #code ```rust pub fn random_numbers(seed: u32) -> impl Iterator { let mut random = seed; std::iter::repeat_with(move || { random ^= random << 13; random ^= random >> 17; random ^= random << 5; random }) } ``` - The best way to seed a PRNG is usually by using a fixed constant. If you absolutely need *some* amount of randomness in the seed, you can use the following hack ([View Highlight](https://read.readwise.io/read/01gpsfxe0t3jr5gj50atv3e4wd)) ^456175259 #code ```rust pub fn random_seed() -> u64 { std::hash::Hasher::finish(&std::hash::BuildHasher::build_hasher( &std::collections::hash_map::RandomState::new(), )) } ``` - Circling back to the beginning of the post, it is very important to distinguish between the two use-cases: ([View Highlight](https://read.readwise.io/read/01gpsg2ecj0a9j6jk288msxcst)) ^456177022 1. using unpredictable data for cryptography 2. using statistically uniform random data for stochastic algorithms ∎