在Netezza中生成均匀的随机范围

时间:2013-05-10 18:16:07

标签: sql random netezza

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    <---
有谁知道我怎么解决这个问题?

谢谢!

2 个答案:

答案 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

这里的关键是告诉系统将随机数舍入到最接近的整数值。