LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
random_normal.c 文件参考
#include <math.h>
#include "random_internal.h"
#include "ziggurat_table.inc"
random_normal.c 的引用(Include)关系图:

浏览该文件的源代码.

宏定义

#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)\) 样本。

宏定义说明

◆ ZIG_N

#define ZIG_N   256

使用 256 个矩形的 Ziggurat 正态采样。

在标准正态分布右半部(x >= 0)采样 |x|,再随机赋予符号。 表布局:

  • zig_xtab[0] = v/f(r):含尾部的底层宽度。
  • zig_xtab[1] = r:尾部截断点。
  • zig_xtab[i](i=2..255):递减的 x 坐标。
  • zig_xtab[256] = 0:分布峰值位置。

r = 3.6541528853610088,v = 0.00492867323399 为半正态中每个矩形的面积。

参见
Marsaglia & Tsang, "The Ziggurat Method for Generating Random Variables", JSS 2000.

在文件 random_normal.c 第 18 行定义.

◆ ZIG_R

#define ZIG_R   3.6541528853610088

在文件 random_normal.c 第 19 行定义.

函数说明

◆ lmmc_rng_standard_normal()

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_rng_normal()

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输出样本值。
返回
LMMC_STATUS_OK 成功; LMMC_STATUS_INVALID_ARGUMENT 若参数非有限、stddev <= 0 或指针为 NULL。
副作用
  • 就地修改 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().

函数调用图:
这是这个函数的调用关系图: