|
LMMC
Lamina Mathematic core
|
宏定义 | |
| #define | ZIG_N 256 |
| 使用 256 个矩形的 Ziggurat 正态采样。 | |
| #define | ZIG_R 3.6541528853610088 |
函数 | |
| double | lmmc_rng_standard_normal (uint64_t *state) |
| 用 256 层 Ziggurat 采样标准正态:先采样 |x|,再随机赋予符号。 | |
| lmmc_status_t | lmmc_rng_normal (lmmc_rng_t *rng, lmmc_real_t mean, lmmc_real_t stddev, lmmc_real_t *out_value) |
| 生成正态分布 \(\mathcal{N}(\mu, \sigma^2)\) 样本。 | |
| #define ZIG_N 256 |
使用 256 个矩形的 Ziggurat 正态采样。
在标准正态分布右半部(x >= 0)采样 |x|,再随机赋予符号。 表布局:
r = 3.6541528853610088,v = 0.00492867323399 为半正态中每个矩形的面积。
在文件 random_normal.c 第 18 行定义.
| #define ZIG_R 3.6541528853610088 |
在文件 random_normal.c 第 19 行定义.
| double lmmc_rng_standard_normal | ( | uint64_t * | state | ) |
用 256 层 Ziggurat 采样标准正态:先采样 |x|,再随机赋予符号。
< 层号,范围 0..255。
< 第 8 位决定符号。
用独立随机数在 [0, xtab[i]) 内均匀采样。
第 0 层包含尾部。
区间 [xtab[1], xtab[0]) 的候选值采用尾部采样。
楔形区以 (f(x) - f(xtab[i])) / (f(xtab[i+1]) - f(xtab[i])) 的概率接受。
< 外边缘密度,值较小。
< 内边缘密度,值较大。
在文件 random_normal.c 第 50 行定义.
引用了 lmmc_rng_standard_normal().
被这些函数引用 lmmc_rng_gamma(), lmmc_rng_normal(), lmmc_rng_standard_normal() , 以及 lmmc_rng_student_t().
| lmmc_status_t lmmc_rng_normal | ( | lmmc_rng_t * | rng, |
| lmmc_real_t | mean, | ||
| lmmc_real_t | stddev, | ||
| lmmc_real_t * | out_value ) |
生成正态分布 \(\mathcal{N}(\mu, \sigma^2)\) 样本。
使用 Box-Muller 或 Ziggurat 方法生成标准正态样本后进行仿射变换。
| [in] | rng | 已初始化的 RNG。 |
| [in] | mean | 均值 \(\mu\) 。 |
| [in] | stddev | 标准差 \(\sigma\) ,必须 > 0。 |
| [out] | out_value | 输出样本值。 |
rng 的内部状态(消耗随机数)。在文件 random_normal.c 第 93 行定义.
引用了 lmmc_rng_normal(), lmmc_rng_standard_normal(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK , 以及 lmmc_rng_t::state.
被这些函数引用 lmmc_rng_normal() , 以及 lmmc_std_random_normal().