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 <---
有人知道我怎么解决这个问题吗?
谢谢!
发布于 2013-05-11 02:20:51
表达式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-13 17:24:21
这个稍作修改的查询在我的环境中的一个大表(大约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
这里的关键是告诉系统将随机数向下舍入到最接近的整数值。
https://stackoverflow.com/questions/16488448
复制相似问题