1 // Copyright 2018 Developers of the Rand project.
2 //
3 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4 // https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5 // <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
6 // option. This file may not be copied, modified, or distributed
7 // except according to those terms.
8 
9 //! This crate implements the [xoshiro] family of pseudorandom number generators
10 //! designed by David Blackman and Sebastiano Vigna. They feature high
11 //! perfomance and a small state and superseed the previous xorshift-based
12 //! generators. However, they are no cryptographically secure and their output
13 //! can be predicted by observing a few samples.
14 //!
15 //! The following generators are implemented:
16 //!
17 //! # 64-bit generators
18 //! - [`Xoshiro256StarStar`]: Recommended for all purposes. Excellent speed and
19 //!   a state space (256 bits) large enough for any parallel application.
20 //! - [`Xoshiro256PlusPlus`]: Recommended for all purposes. Excellent speed and
21 //!   a state space (256 bits) large enough for any parallel application.
22 //! - [`Xoshiro256Plus`]: Recommended for generating 64-bit floating-point
23 //!   numbers. About 15% faster than `Xoshiro256StarStar`, but has a [low linear
24 //!   complexity] in the lowest bits (which are discarded when generating
25 //!   floats), making it fail linearity tests. This is unlikely to have any
26 //!   impact in practise.
27 //! - [`Xoroshiro128StarStar`]: An alternative to `Xoshiro256StarStar`, having
28 //!   the same speed but using half the state. Only suited for low-scale parallel
29 //!   applications.
30 //! - [`Xoroshiro128PlusPlus`]: An alternative to `Xoshiro256PlusPlus`, having
31 //!   the same speed but using half the state. Only suited for low-scale parallel
32 //!   applications.
33 //! - [`Xoroshiro128Plus`]: An alternative to `Xoshiro256Plus`, having the same
34 //!   speed but using half the state. Only suited for low-scale parallel
35 //!   applications. Has a [low linear complexity] in the lowest bits (which are
36 //!   discarded when generating floats), making it fail linearity tests. This is
37 //!   unlikely to have any impact in practise.
38 //! - [`Xoshiro512StarStar`]: An alternative to `Xoshiro256StarStar` with more
39 //!   state and the same speed.
40 //! - [`Xoshiro512PlusPlus`]: An alternative to `Xoshiro256PlusPlus` with more
41 //!   state and the same speed.
42 //! - [`Xoshiro512Plus`]: An alternative to `Xoshiro512Plus` with more
43 //!   state and the same speed. Has a [low linear complexity] in the lowest bits
44 //!   (which are discarded when generating floats), making it fail linearity
45 //!   tests. This is unlikely to have any impact in practise.
46 //! - [`SplitMix64`]: Recommended for initializing generators of the xoshiro
47 //!   familiy from a 64-bit seed. Used for implementing `seed_from_u64`.
48 //!
49 //! # 32-bit generators
50 //! - [`Xoshiro128StarStar`]: Recommended for all purposes. Excellent speed.
51 //! - [`Xoshiro128PlusPlus`]: Recommended for all purposes. Excellent speed.
52 //! - [`Xoshiro128Plus`]: Recommended for generating 32-bit floating-point
53 //!   numbers. Faster than `Xoshiro128StarStar`, but has a [low linear
54 //!   complexity] in the lowest bits (which are discarded when generating
55 //!   floats), making it fail linearity tests. This is unlikely to have any
56 //!   impact in practise.
57 //! - [`Xoroshiro64StarStar`]: An alternative to `Xoshiro128StarStar`, having
58 //!   the same speed but using half the state.
59 //! - [`Xoroshiro64Star`]: An alternative to `Xoshiro128Plus`, having the
60 //!   same speed but using half the state. Has a [low linear complexity] in the
61 //!   lowest bits (which are discarded when generating floats), making it fail
62 //!   linearity tests. This is unlikely to have any impact in practise.
63 //!
64 //! The `*PlusPlus` generators perform similarily to the `*StarStar` generators.
65 //! See the [xoshiro paper], where the differences are discussed in detail.
66 //!
67 //! [xoshiro]: http://xoshiro.di.unimi.it/
68 //! [xoshiro paper]: http://vigna.di.unimi.it/ftp/papers/ScrambledLinear.pdf
69 //! [low linear complexity]: http://xoshiro.di.unimi.it/lowcomp.php
70 
71 #![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk.png",
72        html_favicon_url = "https://www.rust-lang.org/favicon.ico",
73        html_root_url = "https://docs.rs/rand_xoshiro/0.4.0")]
74 
75 #![deny(missing_docs)]
76 #![deny(missing_debug_implementations)]
77 #![allow(clippy::unreadable_literal)]
78 #![no_std]
79 
80 #[macro_use]
81 mod common;
82 mod splitmix64;
83 mod xoshiro128starstar;
84 mod xoshiro128plusplus;
85 mod xoshiro128plus;
86 mod xoshiro256starstar;
87 mod xoshiro256plusplus;
88 mod xoshiro256plus;
89 mod xoshiro512starstar;
90 mod xoshiro512plusplus;
91 mod xoshiro512plus;
92 mod xoroshiro128plus;
93 mod xoroshiro128plusplus;
94 mod xoroshiro128starstar;
95 mod xoroshiro64starstar;
96 mod xoroshiro64star;
97 
98 pub use rand_core;
99 pub use splitmix64::SplitMix64;
100 pub use xoshiro128starstar::Xoshiro128StarStar;
101 pub use xoshiro128plusplus::Xoshiro128PlusPlus;
102 pub use xoshiro128plus::Xoshiro128Plus;
103 pub use xoshiro256starstar::Xoshiro256StarStar;
104 pub use xoshiro256plusplus::Xoshiro256PlusPlus;
105 pub use xoshiro256plus::Xoshiro256Plus;
106 pub use common::Seed512;
107 pub use xoshiro512starstar::Xoshiro512StarStar;
108 pub use xoshiro512plusplus::Xoshiro512PlusPlus;
109 pub use xoshiro512plus::Xoshiro512Plus;
110 pub use xoroshiro128plus::Xoroshiro128Plus;
111 pub use xoroshiro128starstar::Xoroshiro128StarStar;
112 pub use xoroshiro128plusplus::Xoroshiro128PlusPlus;
113 pub use xoroshiro64starstar::Xoroshiro64StarStar;
114 pub use xoroshiro64star::Xoroshiro64Star;
115