Netezza说它的random()函数生成一个介于0.0和0.99999之间的浮点数...... 我试图在一个范围内(例如,在5到10之间)生成随机整数。互联网告诉我使用这样的等式将分数缩放到范围内的数字:
select f,count(*) from (
select CAST(5 + random() * (10-5) as INT) as f
from table_of_numbers
where number between 1 and 5000
) x group by 1 order by 1
但是,当我使用该代码时,样本中的极值不足:
F COUNT
5 486 <---
6 992
7 1057
8 1000
9 937
10 528 <---
有谁知道我怎么解决这个问题?
谢谢!
答案 0 :(得分:7)
表达式random()*(10-5)
生成0到4.99999之间的数字。但是,您有6个值的范围(5,6,7,8,9和10)。所以你的表达式是在6个桶中分割5个值。
您的代码发现第一个和最后一个半满。显然,cast()
操作是对值进行舍入而不是截断它们(我不认为这是ANSI SQL,但它可以解释您的观察结果)。这掩盖了这个问题。
试试这个:
select CAST(4.5 + random() * (10-5+1) as INT)
在其他数据库中,这样的事情应该有效:
select CAST(5 + random() * (10-5+1) as INT)
答案 1 :(得分:1)
这个稍微修改过的查询在我的环境中在一张大桌子(约70米行)上产生了从5到10(包含)的随机数的均匀分布:
select f, count(*) from (
select 5 + floor(random() * 5.99)::int as f
from some_big_table
) x group by 1 order by 1;
F COUNT
5 11659920
6 11663534
7 11665070
8 11668845
9 11665256
10 11549193
这里的关键是告诉系统将随机数舍入到最接近的整数值。