1*9356374aSAndroid Build Coastguard Worker // Copyright 2017 The Abseil Authors. 2*9356374aSAndroid Build Coastguard Worker // 3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*9356374aSAndroid Build Coastguard Worker // 7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*9356374aSAndroid Build Coastguard Worker // 9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*9356374aSAndroid Build Coastguard Worker // limitations under the License. 14*9356374aSAndroid Build Coastguard Worker // 15*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 16*9356374aSAndroid Build Coastguard Worker // File: random.h 17*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 18*9356374aSAndroid Build Coastguard Worker // 19*9356374aSAndroid Build Coastguard Worker // This header defines the recommended Uniform Random Bit Generator (URBG) 20*9356374aSAndroid Build Coastguard Worker // types for use within the Abseil Random library. These types are not 21*9356374aSAndroid Build Coastguard Worker // suitable for security-related use-cases, but should suffice for most other 22*9356374aSAndroid Build Coastguard Worker // uses of generating random values. 23*9356374aSAndroid Build Coastguard Worker // 24*9356374aSAndroid Build Coastguard Worker // The Abseil random library provides the following URBG types: 25*9356374aSAndroid Build Coastguard Worker // 26*9356374aSAndroid Build Coastguard Worker // * BitGen, a good general-purpose bit generator, optimized for generating 27*9356374aSAndroid Build Coastguard Worker // random (but not cryptographically secure) values 28*9356374aSAndroid Build Coastguard Worker // * InsecureBitGen, a slightly faster, though less random, bit generator, for 29*9356374aSAndroid Build Coastguard Worker // cases where the existing BitGen is a drag on performance. 30*9356374aSAndroid Build Coastguard Worker 31*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_RANDOM_RANDOM_H_ 32*9356374aSAndroid Build Coastguard Worker #define ABSL_RANDOM_RANDOM_H_ 33*9356374aSAndroid Build Coastguard Worker 34*9356374aSAndroid Build Coastguard Worker #include <random> 35*9356374aSAndroid Build Coastguard Worker 36*9356374aSAndroid Build Coastguard Worker #include "absl/random/distributions.h" // IWYU pragma: export 37*9356374aSAndroid Build Coastguard Worker #include "absl/random/internal/nonsecure_base.h" // IWYU pragma: export 38*9356374aSAndroid Build Coastguard Worker #include "absl/random/internal/pcg_engine.h" // IWYU pragma: export 39*9356374aSAndroid Build Coastguard Worker #include "absl/random/internal/pool_urbg.h" 40*9356374aSAndroid Build Coastguard Worker #include "absl/random/internal/randen_engine.h" 41*9356374aSAndroid Build Coastguard Worker #include "absl/random/seed_sequences.h" // IWYU pragma: export 42*9356374aSAndroid Build Coastguard Worker 43*9356374aSAndroid Build Coastguard Worker namespace absl { 44*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN 45*9356374aSAndroid Build Coastguard Worker 46*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 47*9356374aSAndroid Build Coastguard Worker // absl::BitGen 48*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 49*9356374aSAndroid Build Coastguard Worker // 50*9356374aSAndroid Build Coastguard Worker // `absl::BitGen` is a general-purpose random bit generator for generating 51*9356374aSAndroid Build Coastguard Worker // random values for use within the Abseil random library. Typically, you use a 52*9356374aSAndroid Build Coastguard Worker // bit generator in combination with a distribution to provide random values. 53*9356374aSAndroid Build Coastguard Worker // 54*9356374aSAndroid Build Coastguard Worker // Example: 55*9356374aSAndroid Build Coastguard Worker // 56*9356374aSAndroid Build Coastguard Worker // // Create an absl::BitGen. There is no need to seed this bit generator. 57*9356374aSAndroid Build Coastguard Worker // absl::BitGen gen; 58*9356374aSAndroid Build Coastguard Worker // 59*9356374aSAndroid Build Coastguard Worker // // Generate an integer value in the closed interval [1,6] 60*9356374aSAndroid Build Coastguard Worker // int die_roll = absl::uniform_int_distribution<int>(1, 6)(gen); 61*9356374aSAndroid Build Coastguard Worker // 62*9356374aSAndroid Build Coastguard Worker // `absl::BitGen` is seeded by default with non-deterministic data to produce 63*9356374aSAndroid Build Coastguard Worker // different sequences of random values across different instances, including 64*9356374aSAndroid Build Coastguard Worker // different binary invocations. This behavior is different than the standard 65*9356374aSAndroid Build Coastguard Worker // library bit generators, which use golden values as their seeds. Default 66*9356374aSAndroid Build Coastguard Worker // construction intentionally provides no stability guarantees, to avoid 67*9356374aSAndroid Build Coastguard Worker // accidental dependence on such a property. 68*9356374aSAndroid Build Coastguard Worker // 69*9356374aSAndroid Build Coastguard Worker // `absl::BitGen` may be constructed with an optional seed sequence type, 70*9356374aSAndroid Build Coastguard Worker // conforming to [rand.req.seed_seq], which will be mixed with additional 71*9356374aSAndroid Build Coastguard Worker // non-deterministic data as detailed below. 72*9356374aSAndroid Build Coastguard Worker // 73*9356374aSAndroid Build Coastguard Worker // Example: 74*9356374aSAndroid Build Coastguard Worker // 75*9356374aSAndroid Build Coastguard Worker // // Create an absl::BitGen using an std::seed_seq seed sequence 76*9356374aSAndroid Build Coastguard Worker // std::seed_seq seq{1,2,3}; 77*9356374aSAndroid Build Coastguard Worker // absl::BitGen gen_with_seed(seq); 78*9356374aSAndroid Build Coastguard Worker // 79*9356374aSAndroid Build Coastguard Worker // // Generate an integer value in the closed interval [1,6] 80*9356374aSAndroid Build Coastguard Worker // int die_roll2 = absl::uniform_int_distribution<int>(1, 6)(gen_with_seed); 81*9356374aSAndroid Build Coastguard Worker // 82*9356374aSAndroid Build Coastguard Worker // Constructing two `absl::BitGen`s with the same seed sequence in the same 83*9356374aSAndroid Build Coastguard Worker // process will produce the same sequence of variates, but need not do so across 84*9356374aSAndroid Build Coastguard Worker // multiple processes even if they're executing the same binary. 85*9356374aSAndroid Build Coastguard Worker // 86*9356374aSAndroid Build Coastguard Worker // `absl::BitGen` meets the requirements of the Uniform Random Bit Generator 87*9356374aSAndroid Build Coastguard Worker // (URBG) concept as per the C++17 standard [rand.req.urng] though differs 88*9356374aSAndroid Build Coastguard Worker // slightly with [rand.req.eng]. Like its standard library equivalents (e.g. 89*9356374aSAndroid Build Coastguard Worker // `std::mersenne_twister_engine`) `absl::BitGen` is not cryptographically 90*9356374aSAndroid Build Coastguard Worker // secure. 91*9356374aSAndroid Build Coastguard Worker // 92*9356374aSAndroid Build Coastguard Worker // This type has been optimized to perform better than Mersenne Twister 93*9356374aSAndroid Build Coastguard Worker // (https://en.wikipedia.org/wiki/Mersenne_Twister) and many other complex URBG 94*9356374aSAndroid Build Coastguard Worker // types on modern x86, ARM, and PPC architectures. 95*9356374aSAndroid Build Coastguard Worker // 96*9356374aSAndroid Build Coastguard Worker // This type is thread-compatible, but not thread-safe. 97*9356374aSAndroid Build Coastguard Worker 98*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 99*9356374aSAndroid Build Coastguard Worker // absl::BitGen member functions 100*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 101*9356374aSAndroid Build Coastguard Worker 102*9356374aSAndroid Build Coastguard Worker // absl::BitGen::operator()() 103*9356374aSAndroid Build Coastguard Worker // 104*9356374aSAndroid Build Coastguard Worker // Calls the BitGen, returning a generated value. 105*9356374aSAndroid Build Coastguard Worker 106*9356374aSAndroid Build Coastguard Worker // absl::BitGen::min() 107*9356374aSAndroid Build Coastguard Worker // 108*9356374aSAndroid Build Coastguard Worker // Returns the smallest possible value from this bit generator. 109*9356374aSAndroid Build Coastguard Worker 110*9356374aSAndroid Build Coastguard Worker // absl::BitGen::max() 111*9356374aSAndroid Build Coastguard Worker // 112*9356374aSAndroid Build Coastguard Worker // Returns the largest possible value from this bit generator. 113*9356374aSAndroid Build Coastguard Worker 114*9356374aSAndroid Build Coastguard Worker // absl::BitGen::discard(num) 115*9356374aSAndroid Build Coastguard Worker // 116*9356374aSAndroid Build Coastguard Worker // Advances the internal state of this bit generator by `num` times, and 117*9356374aSAndroid Build Coastguard Worker // discards the intermediate results. 118*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 119*9356374aSAndroid Build Coastguard Worker 120*9356374aSAndroid Build Coastguard Worker using BitGen = random_internal::NonsecureURBGBase< 121*9356374aSAndroid Build Coastguard Worker random_internal::randen_engine<uint64_t>>; 122*9356374aSAndroid Build Coastguard Worker 123*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 124*9356374aSAndroid Build Coastguard Worker // absl::InsecureBitGen 125*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 126*9356374aSAndroid Build Coastguard Worker // 127*9356374aSAndroid Build Coastguard Worker // `absl::InsecureBitGen` is an efficient random bit generator for generating 128*9356374aSAndroid Build Coastguard Worker // random values, recommended only for performance-sensitive use cases where 129*9356374aSAndroid Build Coastguard Worker // `absl::BitGen` is not satisfactory when compute-bounded by bit generation 130*9356374aSAndroid Build Coastguard Worker // costs. 131*9356374aSAndroid Build Coastguard Worker // 132*9356374aSAndroid Build Coastguard Worker // Example: 133*9356374aSAndroid Build Coastguard Worker // 134*9356374aSAndroid Build Coastguard Worker // // Create an absl::InsecureBitGen 135*9356374aSAndroid Build Coastguard Worker // absl::InsecureBitGen gen; 136*9356374aSAndroid Build Coastguard Worker // for (size_t i = 0; i < 1000000; i++) { 137*9356374aSAndroid Build Coastguard Worker // 138*9356374aSAndroid Build Coastguard Worker // // Generate a bunch of random values from some complex distribution 139*9356374aSAndroid Build Coastguard Worker // auto my_rnd = some_distribution(gen, 1, 1000); 140*9356374aSAndroid Build Coastguard Worker // } 141*9356374aSAndroid Build Coastguard Worker // 142*9356374aSAndroid Build Coastguard Worker // Like `absl::BitGen`, `absl::InsecureBitGen` is seeded by default with 143*9356374aSAndroid Build Coastguard Worker // non-deterministic data to produce different sequences of random values across 144*9356374aSAndroid Build Coastguard Worker // different instances, including different binary invocations. (This behavior 145*9356374aSAndroid Build Coastguard Worker // is different than the standard library bit generators, which use golden 146*9356374aSAndroid Build Coastguard Worker // values as their seeds.) 147*9356374aSAndroid Build Coastguard Worker // 148*9356374aSAndroid Build Coastguard Worker // `absl::InsecureBitGen` may be constructed with an optional seed sequence 149*9356374aSAndroid Build Coastguard Worker // type, conforming to [rand.req.seed_seq], which will be mixed with additional 150*9356374aSAndroid Build Coastguard Worker // non-deterministic data, as detailed in the `absl::BitGen` comment. 151*9356374aSAndroid Build Coastguard Worker // 152*9356374aSAndroid Build Coastguard Worker // `absl::InsecureBitGen` meets the requirements of the Uniform Random Bit 153*9356374aSAndroid Build Coastguard Worker // Generator (URBG) concept as per the C++17 standard [rand.req.urng] though 154*9356374aSAndroid Build Coastguard Worker // its implementation differs slightly with [rand.req.eng]. Like its standard 155*9356374aSAndroid Build Coastguard Worker // library equivalents (e.g. `std::mersenne_twister_engine`) 156*9356374aSAndroid Build Coastguard Worker // `absl::InsecureBitGen` is not cryptographically secure. 157*9356374aSAndroid Build Coastguard Worker // 158*9356374aSAndroid Build Coastguard Worker // Prefer `absl::BitGen` over `absl::InsecureBitGen` as the general type is 159*9356374aSAndroid Build Coastguard Worker // often fast enough for the vast majority of applications. 160*9356374aSAndroid Build Coastguard Worker 161*9356374aSAndroid Build Coastguard Worker using InsecureBitGen = 162*9356374aSAndroid Build Coastguard Worker random_internal::NonsecureURBGBase<random_internal::pcg64_2018_engine>; 163*9356374aSAndroid Build Coastguard Worker 164*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 165*9356374aSAndroid Build Coastguard Worker // absl::InsecureBitGen member functions 166*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 167*9356374aSAndroid Build Coastguard Worker 168*9356374aSAndroid Build Coastguard Worker // absl::InsecureBitGen::operator()() 169*9356374aSAndroid Build Coastguard Worker // 170*9356374aSAndroid Build Coastguard Worker // Calls the InsecureBitGen, returning a generated value. 171*9356374aSAndroid Build Coastguard Worker 172*9356374aSAndroid Build Coastguard Worker // absl::InsecureBitGen::min() 173*9356374aSAndroid Build Coastguard Worker // 174*9356374aSAndroid Build Coastguard Worker // Returns the smallest possible value from this bit generator. 175*9356374aSAndroid Build Coastguard Worker 176*9356374aSAndroid Build Coastguard Worker // absl::InsecureBitGen::max() 177*9356374aSAndroid Build Coastguard Worker // 178*9356374aSAndroid Build Coastguard Worker // Returns the largest possible value from this bit generator. 179*9356374aSAndroid Build Coastguard Worker 180*9356374aSAndroid Build Coastguard Worker // absl::InsecureBitGen::discard(num) 181*9356374aSAndroid Build Coastguard Worker // 182*9356374aSAndroid Build Coastguard Worker // Advances the internal state of this bit generator by `num` times, and 183*9356374aSAndroid Build Coastguard Worker // discards the intermediate results. 184*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 185*9356374aSAndroid Build Coastguard Worker 186*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END 187*9356374aSAndroid Build Coastguard Worker } // namespace absl 188*9356374aSAndroid Build Coastguard Worker 189*9356374aSAndroid Build Coastguard Worker #endif // ABSL_RANDOM_RANDOM_H_ 190