首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Netezza中生成偶数随机范围

在Netezza中生成偶数随机范围
EN

Stack Overflow用户
提问于 2013-05-11 02:16:07
回答 2查看 7.8K关注 0票数 4

Netezza说它的random()函数会生成一个介于0.0和0.99999之间的浮点数...我尝试在一个范围内(例如,在5到10之间)生成随机整数。互联网告诉我使用这样的等式来将分数缩放到一个范围内的数字:

代码语言:javascript
运行
复制
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

但是,当我使用该代码时,样本中的极值表示得不够充分:

代码语言:javascript
运行
复制
F    COUNT
5    486    <---
6    992
7    1057
8    1000
9    937
10   528    <---

有人知道我怎么解决这个问题吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-11 02:20:51

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

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

试试这个:

代码语言:javascript
运行
复制
select CAST(4.5 + random() * (10-5+1) as INT) 

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

代码语言:javascript
运行
复制
select CAST(5 + random() * (10-5+1) as INT) 
票数 7
EN

Stack Overflow用户

发布于 2013-05-13 17:24:21

这个稍作修改的查询在我的环境中的一个大表(大约70M行)上产生了从5到10 (包括在内)的随机数的均匀分布:

代码语言:javascript
运行
复制
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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16488448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档