# Alex Kladov - On Random Numbers (Highlights)

## 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
∎