/
jiteman
/
jsd-fork-abseil-cpp
Обзор
Документация
Войти
/
jiteman
/
jsd-fork-abseil-cpp
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
absl/random/random.h
224 строки
8 KB
jiteman
fucking google ` has been replaced for \'
04 апр 2025, 21:47
04 апр 2025, 21:47
8d66c3c
Код
Авторство
О чём код?
// Copyright 2017 The Abseil Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // ----------------------------------------------------------------------------- // File: random.h // ----------------------------------------------------------------------------- // // This header defines the recommended Uniform Random Bit Generator (URBG) // types for use within the Abseil Random library. These types are not // suitable for security-related use-cases, but should suffice for most other // uses of generating random values. // // The Abseil random library provides the following URBG types: // // * BitGen, a good general-purpose bit generator, optimized for generating // random (but not cryptographically secure) values // * InsecureBitGen, a slightly faster, though less random, bit generator, for // cases where the existing BitGen is a drag on performance. #ifndef ABSL_RANDOM_RANDOM_H_ #define ABSL_RANDOM_RANDOM_H_ #include <cstdint> #include <random> #include "absl/base/config.h" #include "absl/random/distributions.h" // IWYU pragma: export #include "absl/random/internal/nonsecure_base.h" #include "absl/random/internal/pcg_engine.h" #include "absl/random/internal/randen_engine.h" #include "absl/random/seed_sequences.h" // IWYU pragma: export namespace absl { ABSL_NAMESPACE_BEGIN // ----------------------------------------------------------------------------- // absl::BitGen // ----------------------------------------------------------------------------- // // 'absl::BitGen' is a general-purpose random bit generator for generating // random values for use within the Abseil random library. Typically, you use a // bit generator in combination with a distribution to provide random values. // // Example: // // // Create an absl::BitGen. There is no need to seed this bit generator. // absl::BitGen gen; // // // Generate an integer value in the closed interval [1,6] // int die_roll = absl::uniform_int_distribution<int>(1, 6)(gen); // // 'absl::BitGen' is seeded by default with non-deterministic data to produce // different sequences of random values across different instances, including // different binary invocations. This behavior is different than the standard // library bit generators, which use golden values as their seeds. Default // construction intentionally provides no stability guarantees, to avoid // accidental dependence on such a property. // // 'absl::BitGen' may be constructed with an optional seed sequence type, // conforming to [rand.req.seed_seq], which will be mixed with additional // non-deterministic data as detailed below. // // Example: // // // Create an absl::BitGen using an std::seed_seq seed sequence // std::seed_seq seq{1,2,3}; // absl::BitGen gen_with_seed(seq); // // // Generate an integer value in the closed interval [1,6] // int die_roll2 = absl::uniform_int_distribution<int>(1, 6)(gen_with_seed); // // Constructing two 'absl::BitGen's with the same seed sequence in the same // process will produce the same sequence of variates, but need not do so across // multiple processes even if they're executing the same binary. // // 'absl::BitGen' meets the requirements of the Uniform Random Bit Generator // (URBG) concept as per the C++17 standard [rand.req.urng] though differs // slightly with [rand.req.eng]. Like its standard library equivalents (e.g. // 'std::mersenne_twister_engine') 'absl::BitGen' is not cryptographically // secure. // // This type has been optimized to perform better than Mersenne Twister // (https://en.wikipedia.org/wiki/Mersenne_Twister) and many other complex URBG // types on modern x86, ARM, and PPC architectures. // // This type is thread-compatible, but not thread-safe. class BitGen : private random_internal::NonsecureURBGBase< random_internal::randen_engine<uint64_t>> { using Base = random_internal::NonsecureURBGBase< random_internal::randen_engine<uint64_t>>; public: using result_type = typename Base::result_type; // BitGen() // BitGen(SeedSequence seed_seq) // // Copy disallowed. // Move allowed. using Base::Base; using Base::operator=; // BitGen::min() // // Returns the smallest possible value from this bit generator. using Base::min; // BitGen::max() // // Returns the largest possible value from this bit generator. using Base::max; // BitGen::discard(num) // // Advances the internal state of this bit generator by 'num' times, and // discards the intermediate results. using Base::discard; // BitGen::operator()() // // Invoke the URBG, returning a generated value. using Base::operator(); using Base::operator==; using Base::operator!=; }; // ----------------------------------------------------------------------------- // absl::InsecureBitGen // ----------------------------------------------------------------------------- // // 'absl::InsecureBitGen' is an efficient random bit generator for generating // random values, recommended only for performance-sensitive use cases where // 'absl::BitGen' is not satisfactory when compute-bounded by bit generation // costs. // // Example: // // // Create an absl::InsecureBitGen // absl::InsecureBitGen gen; // for (size_t i = 0; i < 1000000; i++) { // // // Generate a bunch of random values from some complex distribution // auto my_rnd = some_distribution(gen, 1, 1000); // } // // Like 'absl::BitGen', 'absl::InsecureBitGen' is seeded by default with // non-deterministic data to produce different sequences of random values across // different instances, including different binary invocations. (This behavior // is different than the standard library bit generators, which use golden // values as their seeds.) // // 'absl::InsecureBitGen' may be constructed with an optional seed sequence // type, conforming to [rand.req.seed_seq], which will be mixed with additional // non-deterministic data, as detailed in the 'absl::BitGen' comment. // // 'absl::InsecureBitGen' meets the requirements of the Uniform Random Bit // Generator (URBG) concept as per the C++17 standard [rand.req.urng] though // its implementation differs slightly with [rand.req.eng]. Like its standard // library equivalents (e.g. 'std::mersenne_twister_engine') // 'absl::InsecureBitGen' is not cryptographically secure. // // Prefer 'absl::BitGen' over 'absl::InsecureBitGen' as the general type is // often fast enough for the vast majority of applications. However, it is // reasonable to use 'absl::InsecureBitGen' in tests or when using a URBG // in small isolated tasks such as in 'std::shuffle'. // // This type is thread-compatible, but not thread-safe. class InsecureBitGen : private random_internal::NonsecureURBGBase< random_internal::pcg64_2018_engine> { using Base = random_internal::NonsecureURBGBase<random_internal::pcg64_2018_engine>; public: using result_type = typename Base::result_type; // InsecureBitGen() // InsecureBitGen(SeedSequence seed_seq) // // Copy disallowed. // Move allowed. using Base::Base; using Base::operator=; // InsecureBitGen::min() // // Returns the smallest possible value from this bit generator. using Base::min; // InsecureBitGen::max() // // Returns the largest possible value from this bit generator. using Base::max; // InsecureBitGen::discard(num) // // Advances the internal state of this bit generator by 'num' times, and // discards the intermediate results. using Base::discard; // InsecureBitGen::operator()() // // Invoke the URBG, returning a generated value. using Base::operator(); using Base::operator==; using Base::operator!=; }; ABSL_NAMESPACE_END } // namespace absl #endif // ABSL_RANDOM_RANDOM_H_