【问题标题】:postgresql random() bug?postgresql 随机()错误?
【发布时间】:2014-12-29 05:54:30
【问题描述】:

我有如下声明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)

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

这是一个错误吗?

【问题讨论】:

  • 多么愚蠢:random() * (9999-1111) + 1111

标签: postgresql random


【解决方案1】:

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

向其中添加一个将为您提供一个从11000 的数字。添加111 将为您提供一个从1111110 的号码。因此,除了看到超过 1000 的某些值之外,您还会看到没有低于 111 的值。

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

random() * 999 + 1

【讨论】:

    【解决方案2】:

    不,这不是错误。

    random 在 [0.0, 1.0] 范围内生成一个数字。将其乘以 999,得到一个范围为 [0.0, 999.0] 的数字。加上 111,你就有了一个在 [111.0, 1110.0] 范围内的数字。

    事实上,考虑到random 的均匀分布,大约有 11% 的机会得到大于 999 的数字。您所描述的结果不仅是可能的,而且是意料之中的。

    【讨论】:

      猜你喜欢
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 2016-05-23
      • 2012-02-16
      • 2011-07-18
      相关资源
      最近更新 更多