|
RandX 1.4.3
基于 xoshiro/xoroshiro 算法族的纯头文件伪随机数生成器库
|
#include <cstdint>#include <array>#include <limits>#include <type_traits>#include <random>#include <algorithm>#include <cassert>#include <string>#include <string_view>#include <unordered_set>#include <vector>#include <stdexcept>#include <ios>#include <istream>#include <ostream>#include <chrono>#include <cstring>
命名空间 | |
| namespace | RandX |
| namespace | RandX::detail |
宏定义 | |
| #define | RANDX_NODISCARD_CXX20 |
枚举 | |
| enum class | RandX::CharSet { RandX::Alphanumeric , RandX::Alpha , RandX::Lower , RandX::Upper , RandX::Digit , RandX::Hex , RandX::Printable , RandX::Base64 , RandX::Base64UrlSafe , RandX::Alphanumeric , RandX::Alpha , RandX::Lower , RandX::Upper , RandX::Digit , RandX::Hex , RandX::Printable , RandX::Base64 , RandX::Base64UrlSafe } |
函数 | |
| template<class Uint32, std::enable_if_t< std::is_same_v< Uint32, std::uint32_t > > * = nullptr> | |
| constexpr float | RandX::FloatFromBits (Uint32 i) noexcept |
| template<class Uint64, std::enable_if_t< std::is_same_v< Uint64, std::uint64_t > > * = nullptr> | |
| constexpr double | RandX::DoubleFromBits (Uint64 i) noexcept |
| static constexpr std::uint64_t | RandX::detail::RotL (const std::uint64_t x, const int s) noexcept |
| static constexpr std::uint32_t | RandX::detail::RotL (const std::uint32_t x, const int s) noexcept |
| static void | RandX::detail::SecureWipe (void *ptr, std::size_t len) noexcept |
| template<std::size_t N> | |
| static constexpr bool | RandX::detail::IsAllZero (const std::array< std::uint64_t, N > &state) noexcept |
| template<std::size_t N> | |
| static constexpr bool | RandX::detail::IsAllZero (const std::array< std::uint32_t, N > &state) noexcept |
| bool | RandX::detail::HardwareRand64 (std::uint64_t &out) noexcept |
| bool | RandX::detail::GetOsEntropyBytes (void *buf, std::size_t n) noexcept |
| bool | RandX::detail::HasCryptoGradeOsEntropy () noexcept |
| static void | RandX::detail::ChaCha20QuarterRound (std::uint32_t &a, std::uint32_t &b, std::uint32_t &c, std::uint32_t &d) noexcept |
| template<class Engine> | |
| std::uint64_t | RandX::detail::Generate64Bits (Engine &engine) |
| template<class Engine, std::enable_if_t< detail::HasJump< Engine >::value > * = nullptr> | |
| constexpr Engine | RandX::MakeStreamEngine (std::uint64_t streamId, std::uint64_t seed=DefaultSeed) |
| std::uint64_t | RandX::RandomSeed () |
| 生成非确定性的 64 位种子 | |
| Xoshiro256StarStar & | RandX::DefaultEngine () |
| void | RandX::SecureRandomBytes (void *buf, std::size_t n) |
| 用 OS 密码学熵源填充 [buf, buf+n) 字节 | |
| std::uint64_t | RandX::SecureSeed () |
| 生成密码学安全的 64 位随机种子 | |
| bool | RandX::IsOsCryptoEntropyAvailable () noexcept |
| 检测 OS 密码学熵源是否可用 | |
| void | RandX::Reseed (std::uint64_t seed) |
| 重置默认引擎的种子(用于测试复现) | |
| void | RandX::ReseedRandom () |
| 重置默认引擎为真随机种子 | |
| template<class T = int, std::enable_if_t< std::is_integral_v< T > > * = nullptr> | |
| T | RandX::RandInt (T min, T max) |
| 生成 [min, max] 范围内的随机整数 | |
| template<class T = int, std::enable_if_t< std::is_integral_v< T > > * = nullptr> | |
| T | RandX::RandInt (T max) |
| 生成 [0, max] 范围内的随机整数 | |
| template<class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandReal (T min=T{0}, T max=T{1}) |
| 生成 [min, max) 范围内的随机浮点数 | |
| bool | RandX::RandBool (double p=0.5) |
| 生成随机布尔值 | |
| template<class Engine> | |
| bool | RandX::RandBool (Engine &engine, double p=0.5) |
| 生成随机布尔值(指定引擎重载) | |
| bool | RandX::RandBernoulli (double p=0.5) |
| 伯努利分布(RandBool 的别名封装,对齐 <random> 命名) | |
| template<class Engine> | |
| bool | RandX::RandBernoulli (Engine &engine, double p=0.5) |
| 伯努利分布(指定引擎重载) | |
| template<class CharT, std::enable_if_t< detail::is_character_v< CharT > > * = nullptr> | |
| CharT | RandX::RandChar (CharT min, CharT max) |
| 生成 [min, max] 范围内的随机字符 | |
| template<class CharT, std::enable_if_t< detail::is_character_v< CharT > > * = nullptr> | |
| CharT | RandX::RandChar (CharT max) |
| 生成 [CharT{}, max] 范围内的随机字符 | |
| template<class CharT, class Engine, std::enable_if_t< detail::is_character_v< CharT > > * = nullptr> | |
| CharT | RandX::RandChar (Engine &engine, CharT min, CharT max) |
| 生成 [min, max] 范围内的随机字符(指定引擎重载) | |
| template<class CharT, class Engine, std::enable_if_t< detail::is_character_v< CharT > > * = nullptr> | |
| CharT | RandX::RandChar (Engine &engine, CharT max) |
| 生成 [CharT{}, max] 范围内的随机字符(指定引擎重载) | |
| std::string_view | RandX::detail::CharSetString (CharSet cs) noexcept |
| char | RandX::RandChar (CharSet cs) |
| 从预设字符集随机取一个字符 | |
| template<class Engine> | |
| char | RandX::RandChar (Engine &engine, CharSet cs) |
| 从预设字符集随机取一个字符(指定引擎重载) | |
| template<class Container, std::enable_if_t< detail::is_random_access_container_v< Container > > * = nullptr> | |
| decltype(auto) | RandX::RandElement (Container &c) |
| 从容器中随机取一个元素(左值容器,返回引用) | |
| template<class Container, std::enable_if_t< detail::is_random_access_container_v< std::decay_t< Container > > > * = nullptr> | |
| std::decay_t< Container >::value_type | RandX::RandElement (Container &&c) |
| 从容器中随机取一个元素(右值容器,按值返回以避免悬垂引用) | |
| template<class It, std::enable_if_t< detail::is_random_access_iterator_v< It > > * = nullptr> | |
| It | RandX::RandElement (It first, It last) |
| 从迭代器范围内随机取一个元素(随机访问迭代器:O(1) 直接定位) | |
| template<class It, std::enable_if_t< detail::is_input_iterator_v< It > &&!detail::is_random_access_iterator_v< It > > * = nullptr> | |
| It | RandX::RandElement (It first, It last) |
| 从迭代器范围内随机取一个元素(输入迭代器:O(n) reservoir sampling) | |
| template<class It, class Engine, std::enable_if_t< detail::is_random_access_iterator_v< It > > * = nullptr> | |
| It | RandX::RandElement (Engine &engine, It first, It last) |
| 从迭代器范围内随机取一个元素(指定引擎,随机访问迭代器) | |
| template<class It, class Engine, std::enable_if_t< detail::is_input_iterator_v< It > &&!detail::is_random_access_iterator_v< It > > * = nullptr> | |
| It | RandX::RandElement (Engine &engine, It first, It last) |
| 从迭代器范围内随机取一个元素(指定引擎,输入迭代器) | |
| template<class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandNormal (T mean=T{0}, T stddev=T{1}) |
| 生成正态分布随机数 | |
| template<class Engine, class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandNormal (Engine &engine, T mean=T{0}, T stddev=T{1}) |
| 生成正态分布随机数(指定引擎重载) | |
| template<class Container, std::enable_if_t< detail::is_random_access_container_v< Container > > * = nullptr> | |
| void | RandX::RandShuffle (Container &&c) |
| 随机打乱容器 | |
| template<class It, class T, std::enable_if_t< detail::is_rand_fillable_v< It, T > > * = nullptr> | |
| void | RandX::RandFill (It first, It last, T min, T max) |
| 用 [min, max] 范围的随机整数填充迭代器区间 | |
| template<class It, class T, class Engine, std::enable_if_t< detail::is_rand_fillable_v< It, T > > * = nullptr> | |
| void | RandX::RandFill (Engine &engine, It first, It last, T min, T max) |
| 用 [min, max] 范围的随机整数填充迭代器区间(指定引擎重载) | |
| template<class T, std::enable_if_t< std::is_integral_v< T > > * = nullptr> | |
| std::vector< T > | RandX::RandVector (T min, T max, std::size_t n) |
| 生成含 n 个随机整数的 vector | |
| template<class T, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| std::vector< T > | RandX::RandVector (T min, T max, std::size_t n) |
| 生成含 n 个随机浮点数的 vector | |
| template<class T, class Engine, std::enable_if_t< std::is_integral_v< T > > * = nullptr> | |
| std::vector< T > | RandX::RandVector (Engine &engine, T min, T max, std::size_t n) |
| 生成含 n 个随机整数的 vector(指定引擎重载) | |
| template<class T, class Engine, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| std::vector< T > | RandX::RandVector (Engine &engine, T min, T max, std::size_t n) |
| 生成含 n 个随机浮点数的 vector(指定引擎重载) | |
| template<class WeightContainer> | |
| WeightContainer::size_type | RandX::RandWeighted (const WeightContainer &weights) |
| 按权重随机选取索引 | |
| template<class Engine, class WeightContainer> | |
| WeightContainer::size_type | RandX::RandWeighted (Engine &engine, const WeightContainer &weights) |
| 按权重随机选取索引(指定引擎重载) | |
| template<class IntType> | |
| IntType | RandX::RandWeighted (std::discrete_distribution< IntType > &dist) |
| 按预构建权重分布随机选取索引(支持高频抽取复用,O(1) 复杂度) | |
| template<class Engine, class IntType> | |
| IntType | RandX::RandWeighted (Engine &engine, std::discrete_distribution< IntType > &dist) |
| 按预构建权重分布随机选取索引(指定引擎,支持高频抽取复用,O(1) 复杂度) | |
| template<class T, class Engine, std::enable_if_t< std::is_integral_v< T > > * = nullptr> | |
| T | RandX::RandInt (Engine &engine, T min, T max) |
| 生成 [min, max] 范围内的随机整数(指定引擎重载) | |
| template<class T, class Engine, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandReal (Engine &engine, T min=T{0}, T max=T{1}) |
| 生成 [min, max) 范围内的随机浮点数(指定引擎重载) | |
| template<class Container, std::enable_if_t< detail::is_random_access_container_v< Container > > * = nullptr> | |
| auto | RandX::RandSample (const Container &c, typename Container::size_type n) |
| 无放回抽样:从容器中随机抽取 n 个元素(Fisher-Yates 前 n 步) | |
| template<class It, std::enable_if_t< detail::is_random_access_iterator_v< It > > * = nullptr> | |
| std::vector< typename std::iterator_traits< It >::value_type > | RandX::RandSample (It first, It last, typename std::iterator_traits< It >::difference_type n) |
| template<class It, std::enable_if_t< detail::is_input_iterator_v< It > &&!detail::is_random_access_iterator_v< It > > * = nullptr> | |
| std::vector< typename std::iterator_traits< It >::value_type > | RandX::RandSample (It first, It last, typename std::iterator_traits< It >::difference_type n) |
| template<class It, class Engine, std::enable_if_t< detail::is_random_access_iterator_v< It > > * = nullptr> | |
| std::vector< typename std::iterator_traits< It >::value_type > | RandX::RandSample (Engine &engine, It first, It last, typename std::iterator_traits< It >::difference_type n) |
| template<class It, class Engine, std::enable_if_t< detail::is_input_iterator_v< It > &&!detail::is_random_access_iterator_v< It > > * = nullptr> | |
| std::vector< typename std::iterator_traits< It >::value_type > | RandX::RandSample (Engine &engine, It first, It last, typename std::iterator_traits< It >::difference_type n) |
| std::vector< std::size_t > | RandX::RandPermutation (std::size_t n) |
| 生成 [0, n) 的随机排列 | |
| std::string | RandX::RandString (std::size_t length, std::string_view charset="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") |
| 生成指定长度的随机字符串 | |
| std::string | RandX::RandString (std::size_t n, CharSet cs) |
| 从预设字符集生成随机字符串 | |
| template<class Engine> | |
| std::string | RandX::RandString (Engine &engine, std::size_t n, CharSet cs) |
| 从预设字符集生成随机字符串(指定引擎重载) | |
| template<class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandExp (T lambda=T{1}) |
| 生成指数分布随机数 | |
| template<class Engine, class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandExp (Engine &engine, T lambda=T{1}) |
| 生成指数分布随机数(指定引擎重载) | |
| template<class T = int, std::enable_if_t< std::is_integral_v< T > > * = nullptr> | |
| T | RandX::RandPoisson (double mean=1.0) |
| 生成泊松分布随机数 | |
| template<class Engine, class T = int, std::enable_if_t< std::is_integral_v< T > > * = nullptr> | |
| T | RandX::RandPoisson (Engine &engine, double mean=1.0) |
| 生成泊松分布随机数(指定引擎重载) | |
| template<class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandGamma (T alpha=T{1}, T beta=T{1}) |
| 生成伽马分布随机数 | |
| template<class Engine, class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandGamma (Engine &engine, T alpha=T{1}, T beta=T{1}) |
| 生成伽马分布随机数(指定引擎重载) | |
| template<class T = int, std::enable_if_t< std::is_integral_v< T > > * = nullptr> | |
| T | RandX::RandBinomial (T t=1, double p=0.5) |
| 生成二项分布随机数 | |
| template<class T = int, class Engine, std::enable_if_t< std::is_integral_v< T > > * = nullptr> | |
| T | RandX::RandBinomial (Engine &engine, T t=1, double p=0.5) |
| 生成二项分布随机数(指定引擎重载) | |
| template<class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandLogNormal (T mean=T{0}, T stddev=T{1}) |
| 生成对数正态分布随机数 | |
| template<class T = double, class Engine, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandLogNormal (Engine &engine, T mean=T{0}, T stddev=T{1}) |
| 生成对数正态分布随机数(指定引擎重载) | |
| template<class T = int, std::enable_if_t< std::is_integral_v< T > > * = nullptr> | |
| T | RandX::RandGeometric (double p=0.5) |
| 生成几何分布随机数(首次成功前的失败次数) | |
| template<class T = int, class Engine, std::enable_if_t< std::is_integral_v< T > > * = nullptr> | |
| T | RandX::RandGeometric (Engine &engine, double p=0.5) |
| 生成几何分布随机数(指定引擎重载) | |
| template<class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandCauchy (T a=T{0}, T b=T{1}) |
| 生成柯西分布随机数 | |
| template<class T = double, class Engine, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandCauchy (Engine &engine, T a=T{0}, T b=T{1}) |
| 生成柯西分布随机数(指定引擎重载) | |
| template<class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandWeibull (T a=T{1}, T b=T{1}) |
| 生成韦布尔分布随机数 | |
| template<class T = double, class Engine, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandWeibull (Engine &engine, T a=T{1}, T b=T{1}) |
| 生成韦布尔分布随机数(指定引擎重载) | |
| template<class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandExtremeValue (T a=T{0}, T b=T{1}) |
| 生成极值分布(Gumbel)随机数 | |
| template<class T = double, class Engine, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandExtremeValue (Engine &engine, T a=T{0}, T b=T{1}) |
| 生成极值分布随机数(指定引擎重载) | |
| template<class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandChiSquared (T n=T{1}) |
| 生成卡方分布随机数 | |
| template<class T = double, class Engine, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandChiSquared (Engine &engine, T n=T{1}) |
| 生成卡方分布随机数(指定引擎重载) | |
| template<class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandStudentT (T n=T{1}) |
| 生成学生 t 分布随机数 | |
| template<class T = double, class Engine, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandStudentT (Engine &engine, T n=T{1}) |
| 生成学生 t 分布随机数(指定引擎重载) | |
| template<class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandFisherF (T m=T{1}, T n=T{1}) |
| 生成 Fisher F 分布随机数 | |
| template<class T = double, class Engine, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandFisherF (Engine &engine, T m=T{1}, T n=T{1}) |
| 生成 Fisher F 分布随机数(指定引擎重载) | |
| template<class T = double, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandBeta (T a=T{1}, T b=T{1}) |
| 生成 Beta 分布随机数 | |
| template<class T = double, class Engine, std::enable_if_t< std::is_floating_point_v< T > > * = nullptr> | |
| T | RandX::RandBeta (Engine &engine, T a=T{1}, T b=T{1}) |
| 生成 Beta 分布随机数(指定引擎重载) | |
| template<int N, class T = std::uint64_t, std::enable_if_t< std::is_integral_v< T > &&(N > 0) &&(N<=64) &&(N<=std::numeric_limits< T >::digits)> * = nullptr> | |
| T | RandX::RandBits () noexcept |
| 生成 N 位随机整数 | |
| template<class Engine> | |
| std::string | RandX::RandUUID (Engine &engine) |
| 生成随机 UUID v4 字符串 | |
| std::string | RandX::RandUUID () |
| template<class CharT, class Traits, class Engine, std::enable_if_t< detail::is_serializable_engine_v< Engine > > * = nullptr> | |
| std::basic_ostream< CharT, Traits > & | RandX::operator<< (std::basic_ostream< CharT, Traits > &os, const Engine &engine) |
| template<class CharT, class Traits, class Engine, std::enable_if_t< detail::is_serializable_engine_v< Engine > > * = nullptr> | |
| std::basic_istream< CharT, Traits > & | RandX::operator>> (std::basic_istream< CharT, Traits > &is, Engine &engine) |
变量 | |
| template<class T> | |
| constexpr bool | RandX::detail::is_character_v = is_character<T>::value |
| template<class It> | |
| constexpr bool | RandX::detail::is_random_access_iterator_v |
| template<class It> | |
| constexpr bool | RandX::detail::is_input_iterator_v |
| template<class C> | |
| constexpr bool | RandX::detail::is_random_access_container_v |
| template<class It, class T> | |
| constexpr bool | RandX::detail::is_rand_fillable_v = is_rand_fillable<It, T>::value |
| template<class S> | |
| constexpr bool | RandX::detail::is_indexable_state_v = is_indexable_state<S>::value |
| template<class E> | |
| constexpr bool | RandX::detail::is_serializable_engine_v = is_serializable_engine<E>::value |
| #define RANDX_NODISCARD_CXX20 |