# Squares RNG
Implementation of the [Squares CBRNG](https://arxiv.org/abs/2004.06278)
- Counter-based RNGs are non-serial: you can jump to any index in the RNG sequence. This is especially useful in parallel / distributed contexts
- Squares is the fastest known CBRNG, and has higher quality than [Philox](https://www.semanticscholar.org/paper/Parallel-random-numbers%3A-As-easy-as-1%2C-2%2C-3-Salmon-Moraes/7a1bc9d13c484610133ee50ac3126f5adc5b29b9?utm_source=direct_link) at 2x speed
- Squares is still slower than serial RNGs
- Provides `2^64` outputs per key
- This crate is `no_std`, and all functions are `const`
# Example
CBRNGs are stateless. A `key` is like a `seed`.
```rust , ignore
let r32 = squares::u32(key, idx);
let r64 = squares::u64(key, idx);
```
# Admissible Keys
Squares keys are not arbitrary! Many bit patterns can lead to poor output quality.
The `key` function makes an admissible Squares key from a "seed" index, which has no restrictions.
```rust
let key = squares::key(239482304);
```
For a manual key, see `Key::checked` and `Key::unchecked`.
# `rand` Compatibility
Enable the `rand` feature to expose `Squares`, an RNG struct compatible with the `rand` crates.
# Approximate Throughput
Results will vary. On my laptop (M1 Max):
| `u32` | `1.29ns` | `3.10 GB/s` |
| `u64` | `1.65ns` | `4.85 GB/s` |
| `key` | `24.5ns` | `40.8 M/s` |
# License
`MIT OR Apache-2.0`