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

Chr*_*ris 4 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
Run Code Online (Sandbox Code Playgroud)

但是,当我使用该代码时,极值在样本中代表性不足:

F    COUNT
5    486    <---
6    992
7    1057
8    1000
9    937
10   528    <---
有谁知道我怎么解决这个问题?

谢谢!

Gor*_*off 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) 
Run Code Online (Sandbox Code Playgroud)

在其他数据库中,这样的东西应该工作:

select CAST(5 + random() * (10-5+1) as INT) 
Run Code Online (Sandbox Code Playgroud)