PostgreSQL 16新特性之正态分布随机数函数
-- 创建一个名为random_normal_dist的函数,用于生成服从正态分布的随机浮点数
CREATE OR REPLACE FUNCTION random_normal_dist(mean float8, stddev float8)
RETURNS float8 AS $$
DECLARE
v_const float8;
v_rand float8;
BEGIN
-- 计算常数
v_const := random() * 2.0 * atan(1.0) * (-1.0 / 12.0);
-- 循环生成随机数直至符合正态分布
LOOP
v_rand := exp(v_const - (1.0 / 12.0) * power(v_const, 2.0));
-- 如果生成的随机数小于等于0,则继续循环
IF v_rand <= 0 THEN
CONTINUE;
END IF;
-- 使用Box-Muller变换转换为正态分布的随机数
RETURN mean + stddev * sqrt(-2.0 * log(v_rand)) * sin(v_const);
END LOOP;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;
-- 使用函数生成一个正态分布的随机数,平均值为50,标准差为10
SELECT random_normal_dist(50, 10);
这段代码首先定义了一个名为random_normal_dist
的函数,该函数使用Box-Muller变换来生成正态分布的随机浮点数。函数是不可变的(IMMUTABLE)且在计算时如果输入参数是常量,则返回的结果也是常量(STRICT)。最后,提供了一个使用该函数的例子,生成一个平均值为50,标准差为10的正态分布随机数。
评论已关闭