4

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

谢谢!

4

2 回答 2

7

该表达式random()*(10-5)生成从 0 到 4.99999 的数字。但是,您有 6 个值的范围(5、6、7、8、9 和 10)。因此,您的表达式将 5 个值拆分为 6 个存储桶。

您的代码发现第一个和最后一个是半满的。显然,该cast()操作是对值进行舍入而不是截断它们(我认为这不是 ANSI SQL,但它可以解释您观察到的结果)。这掩盖了问题。

尝试这个:

select CAST(4.5 + random() * (10-5+1) as INT) 

在其他数据库中,这样的事情应该可以工作:

select CAST(5 + random() * (10-5+1) as INT) 
于 2013-05-10T18:20:50.943 回答
1

这个稍作修改的查询在我的环境中的一个大表(约 70m 行)上产生了从 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

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

于 2013-05-13T09:24:20.860 回答