【问题标题】:Generating an even random range in Netezza在 Netezza 中生成偶数随机范围
【发布时间】:2013-05-05 12:04:53
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: sql random netezza


    【解决方案1】:

    表达式 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) 
    

    【讨论】:

    • 您也可以使用 Netezza FLOOR 函数明确限定它:FLOOR(RANDOM() * 6) + 5 将为您提供数字 5 到 10 的非常均匀的随机分布。
    【解决方案2】:

    这个稍作修改的查询在我的环境中的一个大表(约 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多