36#include <initializer_list>
56 thread_local std::mt19937 gen(std::chrono::high_resolution_clock::now()
79 template <
class T =
int>
83 return std::uniform_int_distribution<T>(
min,
max)(gen);
94 template <
class T =
double>
98 return std::uniform_real_distribution<T>(
min,
max)(gen);
111 ->
decltype(*std::begin(c))
113 if (std::begin(c) == std::end(c))
115 return *std::next(std::begin(c),
129 -> std::remove_reference<
decltype(*std::begin(c))>::type
131 if (std::begin(c) == std::end(c))
133 return *std::next(std::begin(c),
146 auto choice(std::initializer_list<T> init,
148 ->
decltype(*std::begin(init))
162 if (std::begin(c) == std::end(c))
164 for (
size_t i = c.size() - 1; i > 0; i--)
167 std::swap(*std::next(std::begin(c), i),
168 *std::next(std::begin(c), j));
181 template <
class T =
double>
185 std::vector<T> vec(n);
186 std::normal_distribution<T> dist(
mean, sd);
201 template <
class T =
double>
205 std::vector<T> vec(n);
221 template <
class T =
int>
222 std::vector<T>
rbinom(
size_t n,
T size,
double prob,
225 std::vector<T> vec(n);
226 std::binomial_distribution<T> dist(size, prob);
240 template <
class T =
int>
241 std::vector<T>
rpois(
size_t n,
double lambda,
244 std::vector<T> vec(n);
245 std::poisson_distribution<T> dist(lambda);
259 template <
class T =
double>
260 std::vector<T>
rexp(
size_t n,
T rate = 1.0,
263 std::vector<T> vec(n);
264 std::exponential_distribution<T> dist(rate);
280 template <
class T =
double>
281 std::vector<T>
rgamma(
size_t n,
T shape,
T rate = 1.0,
284 std::vector<T> vec(n);
285 std::gamma_distribution<T> dist(shape, 1.0 / rate);
300 template <
class T =
double>
301 std::vector<T>
rbeta(
size_t n,
T shape1,
T shape2,
304 std::vector<T> vec(n);
305 std::beta_distribution<T> dist(shape1, shape2);
320 template <
class T =
double>
324 return rgamma(n, df / 2.0, 0.5, gen);
335 template <
class T =
double>
336 std::vector<T>
rt(
size_t n,
T df,
339 std::vector<T> vec(n);
340 std::student_t_distribution<T> dist(df);
355 template <
class T =
double>
356 std::vector<T>
rf(
size_t n,
T df1,
T df2,
359 std::vector<T> vec(n);
360 std::fisher_f_distribution<T> dist(df1, df2);
375 template <
class T =
double>
376 std::vector<T>
rlnorm(
size_t n,
T meanlog = 0.0,
T sdlog = 1.0,
379 std::vector<T> vec(n);
380 std::lognormal_distribution<T> dist(meanlog, sdlog);
395 template <
class T =
double>
399 std::vector<T> vec(n);
400 std::weibull_distribution<T> dist(shape, scale);
418 auto sample(
C &&c,
size_t size,
bool replace =
false,
420 -> std::vector<
typename std::iterator_traits<
decltype(std::begin(c))>::value_type>
422 using value_type =
typename std::iterator_traits<
decltype(std::begin(c))>::value_type;
423 std::vector<value_type> result;
424 result.reserve(size);
425 auto it_begin = std::begin(c);
426 auto it_end = std::end(c);
427 size_t n = std::distance(it_begin, it_end);
430 "Cannot sample from empty container");
431 if (!replace && size > n)
433 "Sample size exceeds container size when replace=false");
435 for (
size_t i = 0; i < size; ++i)
437 result.push_back(*std::next(
439 std::uniform_int_distribution<size_t>(0, n - 1)(gen)));
443 std::vector<size_t> indices(n);
444 std::iota(indices.begin(), indices.end(), 0);
446 for (
size_t i = 0; i < size; ++i)
447 result.push_back(*std::next(it_begin, indices[i]));
463 std::vector<T>
sample(std::initializer_list<T> init,
465 bool replace =
false,
表示通用容器操作错误。
Definition csexc.h:135
定义 console 库使用的自定义异常类层次结构。
T min(const MultiArray< T, Dims... > &a)
求最小值。
Definition multiarray.h:1551
T max(const MultiArray< T, Dims... > &a)
求最大值。
Definition multiarray.h:1561
auto sample(C &&c, size_t size, bool replace=false, std::mt19937 &gen=default_gen()) -> std::vector< typename std::iterator_traits< decltype(std::begin(c))>::value_type >
从容器中随机抽取指定数量的元素(有放回或无放回)。
Definition random.h:418
std::vector< T > rpois(size_t n, double lambda, std::mt19937 &gen=default_gen())
生成 n 个服从泊松分布(Poisson Distribution)的随机数。
Definition random.h:241
std::vector< T > rbeta(size_t n, T shape1, T shape2, std::mt19937 &gen=default_gen())
生成 n 个服从贝塔分布(Beta Distribution)的随机数。
Definition random.h:301
std::vector< T > rlnorm(size_t n, T meanlog=0.0, T sdlog=1.0, std::mt19937 &gen=default_gen())
生成 n 个服从对数正态分布(Lognormal Distribution)的随机数。
Definition random.h:376
std::vector< T > rbinom(size_t n, T size, double prob, std::mt19937 &gen=default_gen())
生成 n 个服从二项分布(Binomial Distribution)的随机数。
Definition random.h:222
T uniform(T min=0.0, T max=1.0, std::mt19937 &gen=default_gen())
生成一个指定范围内的随机浮点数(均匀分布)。
Definition random.h:95
auto choice(C &c, std::mt19937 &gen=default_gen()) -> decltype(*std::begin(c))
从容器中随机选择一个元素(左值版本,返回引用)。
Definition random.h:110
std::vector< T > rf(size_t n, T df1, T df2, std::mt19937 &gen=default_gen())
生成 n 个服从 F 分布(Fisher–Snedecor F-distribution)的随机数。
Definition random.h:356
void seed(unsigned int seed)
修改 default_gen 提供的随机数引擎的种子。
Definition random.h:66
std::vector< T > rexp(size_t n, T rate=1.0, std::mt19937 &gen=default_gen())
生成 n 个服从指数分布(Exponential Distribution)的随机数。
Definition random.h:260
std::vector< T > runif(size_t n, T min=0.0, T max=1.0, std::mt19937 &gen=default_gen())
生成 n 个服从均匀分布(Uniform Distribution)的随机数。
Definition random.h:202
void shuffle(C &&c, std::mt19937 &gen=default_gen())
随机打乱容器中元素的顺序(Fisher-Yates 洗牌算法)。
Definition random.h:160
std::mt19937 & default_gen()
获取一个全局的、以当前时间戳为种子的 Mersenne Twister 随机数引擎。
Definition random.h:54
T randint(T min=0, T max=32767, std::mt19937 &gen=default_gen())
生成一个指定范围内的随机整数(均匀分布)。
Definition random.h:80
std::vector< T > rt(size_t n, T df, std::mt19937 &gen=default_gen())
生成 n 个服从 t 分布(Student's t-distribution)的随机数。
Definition random.h:336
std::vector< T > rchisq(size_t n, T df, std::mt19937 &gen=default_gen())
生成 n 个服从卡方分布(Chi-squared Distribution)的随机数。
Definition random.h:321
std::vector< T > rnorm(size_t n, T mean=0.0, T sd=1.0, std::mt19937 &gen=default_gen())
生成 n 个服从正态分布(Normal Distribution)的随机数。
Definition random.h:182
std::vector< T > rweibull(size_t n, T shape, T scale=1.0, std::mt19937 &gen=default_gen())
生成 n 个服从韦布尔分布(Weibull Distribution)的随机数。
Definition random.h:396
std::vector< T > rgamma(size_t n, T shape, T rate=1.0, std::mt19937 &gen=default_gen())
生成 n 个服从伽马分布(Gamma Distribution)的随机数。
Definition random.h:281
typename uniform_distribution_impl< T >::type uniform_distribution_t
取得对印类型所对应的均匀分布。
Definition sfinae.h:381
提供编译期类型特征检测(SFINAE 工具),用于判断容器、可调用对象、迭代器、下标访问、字符串、可打印类型、字符类型等。