16 releases (9 breaking)

0.10.1 Feb 24, 2024
0.10.0 Feb 7, 2023
0.9.0 Jan 19, 2023
0.8.3 Dec 20, 2022
0.5.1 Jul 13, 2022

#168 in Algorithms

Download history 436/week @ 2024-07-22 364/week @ 2024-07-29 330/week @ 2024-08-05 494/week @ 2024-08-12 360/week @ 2024-08-19 473/week @ 2024-08-26 352/week @ 2024-09-02 370/week @ 2024-09-09 210/week @ 2024-09-16 445/week @ 2024-09-23 354/week @ 2024-09-30 367/week @ 2024-10-07 336/week @ 2024-10-14 242/week @ 2024-10-21 212/week @ 2024-10-28 328/week @ 2024-11-04

1,133 downloads per month
Used in 13 crates (3 directly)

Apache-2.0 OR MIT

220KB
2.5K SLoC

turborand

CI License Cargo Documentation

Fast random number generators.

turborand's internal implementations use Wyrand, a simple and fast generator but not cryptographically secure, and also ChaCha8, a cryptographically secure generator tuned to 8 rounds of the ChaCha algorithm in order to increase throughput considerably without sacrificing too much security, as per the recommendations set out in the Too Much Crypto paper.

Examples

use turborand::prelude::*;

let rand = Rng::new();

if rand.bool() {
    println!("Success! :D");
} else {
    println!("Failure... :(");
}

Sample a value from a list:

use turborand::prelude::*;

let rand = Rng::new();

let values = [1, 2, 3, 4, 5];

let value = rand.sample(&values);

Generate a vector with random values:

use turborand::prelude::*;
use std::iter::repeat_with;

let rand = Rng::new();

let values: Vec<_> = repeat_with(|| rand.f32()).take(10).collect();

no-std Compatibility

turborand can be exposed to no-std environments, however only with reduced capability and feature sets. There'll be no Default implementations, and no new() constructors, so Rng/ChaChaRng seeds must be provided by the user from whatever source available on the platform. Some TurboRand methods will also not be available unless the alloc feature is enabled, which necessitates having a global allocator.

Compiling for WASM

For suppporting WASM builds, you'll need to add the following to your Cargo.toml:

[target.'cfg(target_arch = "wasm32")'.dependencies]
instant = { version = "0.1", features = ["wasm-bindgen"] }

instant needs either the wasm-bindgen or stdweb feature active on WASM in order to compile. stdweb however is unmaintained, but to support future alternatives and features, toggling on WASM support is left to the user of this crate.

Performance

Wyrand is a pretty fast PRNG, and is a good choice when speed is needed while still having decent statistical properties. Currently, the turborand implementation benches extremely well against similar rand algorithms. Below is a chart of the fill_bytes method performance, tested on Windows 10 x64 on an AMD Ryzen 1700 clocked at 3.7Ghz with 32GB RAM at 3066Mhz.

fill_bytes benchmark

For filling 2048 byte array buffers, turborand's Rng is able to do so in around 170-180ns, whereas SmallRng does it between 260-268ns, and Pcg64Mcg (the fastest PCG impl on 64bit systems) does it in 305-312ns.

u64 gen benchmark

For generating unbound u64 values, turborand and fastrand are equal in performance, which is expected given they both implement the Wyrand algorithm, consistently performing around 820-830ps for generating a u64 value. SmallRng performs around 1.16ns, while Pcg64Mcg is at 1.35ns.

Migrating between versions

Check out MIGRATION.md to get all the notes needed to migrate between major versions of turborand.

License

Licensed under either of

at your option.

Dependencies

~0–475KB