postgresql random()bug?

时间:2014-12-29 05:54:31

标签: postgresql random

我有以下声明select random() * 999 + 111 from generate_series(1,10)

导致:

690,046183290426
983,732229881454
1091,53674799064
659,380498787854
398,545482470188
775,65887248842
1044,79942638567
173,288027528208
584,690435883589
522,077123570256

如你所见;两个值超过999!

这个工作正常: select random() * 9 + 1 from generate_series(1,10)

我的系统是:x86_64-unknown-linux-gnu上的PostgreSQL 9.3.5,由gcc编译(Ubuntu 4.8.2-19ubuntu1)4.8.2,64位

这是一个错误吗?

2 个答案:

答案 0 :(得分:3)

不,这不是错误。表达式random() * 999为您提供了从0999的数字。

在其中添加一个将为您提供11000的数字。添加111会为您提供1111110的号码。因此,除了看到一些超过一千的价值之外,你还会看到一百零一十一以下。

您的错误似乎是假设,当您使用999代替9时,您必须添加111而不是1。事实并非如此。要获得11000的数字,您需要:

random() * 999 + 1

答案 1 :(得分:0)

不,这不是一个错误。

random生成[0.0,1.0]范围内的数字。将此乘以999,得到的数字范围为[0.0,999.0]。添加111,您的数字在[111.0,1110.0]范围内。

事实上,如果按random进行均匀分布,则大约有11%的机会获得大于999的数字。您所描述的结果不可能是唯一可能的,这是预期的。