12 if (rng == NULL || out == NULL) {
15 if (!isfinite(shape) || !isfinite(scale) ||
16 shape <= 0.0 || scale <= 0.0) {
28 u = u64_to_double01(xoshiro256ss_next(rng->
state));
30 u = u64_to_double01(xoshiro256ss_next(rng->
state));
32 *out = scale * g * pow(u, 1.0 / shape);
37 d = shape - 1.0 / 3.0;
38 c = 1.0 / sqrt(9.0 * d);
47 u = u64_to_double01(xoshiro256ss_next(rng->
state));
50 if (u < 1.0 - 0.0331 * (x * x) * (x * x)) {
56 if (log(u) < 0.5 * x * x + d * (1.0 - v + log(v))) {
76 for (attempt = 0; attempt < 64; ++attempt) {
77 const double u = u64_to_double01(xoshiro256ss_next(rng->
state));
94 m = fmin(1.0, fmin(alpha, beta_param));
95 ta = alpha < 1.0 ? (m / alpha) * ua : 0.0;
96 tb = beta_param < 1.0 ? (m / beta_param) * ub : 0.0;
101 difference = (tb - ta) / m + (b - a);
103 if (difference >= 0.0) {
104 q = exp(-difference);
105 value = q / (1.0 + q);
108 value = 1.0 / (1.0 + q);
110 if (!isfinite(value) || value < 0.0 || value > 1.0) {
126 if (rng == NULL || out == NULL) {
129 if (!isfinite(alpha) || !isfinite(beta_param) ||
130 alpha <= 0.0 || beta_param <= 0.0) {
134 st = beta_log_gamma_parts(rng, alpha, &a, &ua);
139 st = beta_log_gamma_parts(rng, beta_param, &b, &ub);
144 return beta_ratio_from_log_parts(alpha, beta_param, a, b, ua, ub, out);
152 if (rng == NULL || out == NULL) {
155 if (!isfinite(df) || df <= 0.0) {
159 if (df / 2.0 == 0.0) {
167 u = u64_to_double01(xoshiro256ss_next(rng->
state));
170 *out = g * exp(2.0 * log(u) / df);
185 if (rng == NULL || out == NULL) {
188 if (!isfinite(df) || df <= 0.0) {
199 denom = sqrt(chi2 / df);
204 if (!isfinite(value)) {
220 if (rng == NULL || out == NULL) {
223 if (!isfinite(df1) || !isfinite(df2) ||
224 df1 <= 0.0 || df2 <= 0.0) {
238 denominator = chi2 / df2;
239 if (denominator == 0.0) {
242 value = (chi1 / df1) / denominator;
243 if (!isfinite(value)) {
double lmmc_real_t
Public and internal LMMC real type.
lmmc_status_t lmmc_rng_student_t(lmmc_rng_t *rng, lmmc_real_t df, lmmc_real_t *out)
生成 Student-t 分布样本 t(df)。
lmmc_status_t lmmc_rng_chi_squared(lmmc_rng_t *rng, lmmc_real_t df, lmmc_real_t *out)
生成卡方分布样本 Chi-squared(df)。
lmmc_status_t lmmc_rng_f(lmmc_rng_t *rng, lmmc_real_t df1, lmmc_real_t df2, lmmc_real_t *out)
生成 F 分布样本 F(df1, df2)。
lmmc_status_t lmmc_rng_gamma(lmmc_rng_t *rng, lmmc_real_t shape, lmmc_real_t scale, lmmc_real_t *out)
生成 Gamma 分布样本 。
lmmc_status_t lmmc_rng_beta(lmmc_rng_t *rng, lmmc_real_t alpha, lmmc_real_t beta_param, lmmc_real_t *out)
生成 Beta 分布样本 Beta(alpha, beta)。
double lmmc_rng_standard_normal(uint64_t *state)
用 256 层 Ziggurat 采样标准正态:先采样 |x|,再随机赋予符号。
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_CONVERGENCE_FAILED
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_INVALID_ARGUMENT