为什么我的PostgreSQL随机数用零填充?

时间:2017-03-30 16:25:15

标签: postgresql decimal plpgsql

我编写了一个PostgreSQL函数来生成一个(最多)40位的随机数。

在运行该函数几次之后,似乎生成的数字只有其实际随机化的前导(最多)15位数(范围0-9)。以下数字均为零。

这对我来说非常出乎意料。这是由于我不知道的限制,例如在DECIMAL类型,OS中,还是在乘法运算中?

示例输出:

  • 9690529912293880000000000000000000000000
  • 3876745014239130000000000000000000000000
  • 8298320658130730000000000000000000000000

由于

CREATE OR REPLACE FUNCTION test_random()
  RETURNS DECIMAL(40) AS
$BODY$
DECLARE
    r DECIMAL(40) := 0;
    pos INTEGER := NULL;
BEGIN

    FOR pos IN 1..40 LOOP
        r := r * 10 + FLOOR(random() * 10);
    END LOOP;

    RETURN r;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

SELECT test_random();

1 个答案:

答案 0 :(得分:3)

random返回精度有限的double precisionnumeric + double precision会产生double precision。为了避免将其转换为数字:

r := r * 10 + floor(random()::numeric * 10);