【问题标题】:How to generate numbers between two values如何在两个值之间生成数字
【发布时间】:2021-02-20 11:04:52
【问题描述】:

我想生成 2 个值之间的数字,例如 32 到 35 之间的 15 个数字。

这是我写的:

SELECT LEVEL+31 + round(dbms_random.value(1, 4))
FROM   dual CONNECT BY LEVEL <=15;

但它给了我这样的结果:

 34
 36
 37
 36
 39
 39
 40
 41
 44
 44
 45
 47
 45
 47
 47

我希望所有 15 个值都在 31 到 35 的范围内。

【问题讨论】:

  • 在您问题的第一行中,您说“介于 32 和 35 之间”,在最后一行中,您说“范围 31 到 35”。你能下定决心吗?除此之外,您是否希望以(大约)相等的频率生成数字?如果是,请注意round 函数不会这样做。你应该使用trunc

标签: sql oracle oracle11g


【解决方案1】:

SELECT 中删除LEVEL 并修改dbms_random.value 中的限制

SQL> select round(dbms_random.value(31, 35)) result
  2  from dual
  3  connect by level <= 15;

    RESULT
----------
        32
        31
        34
        32
        34
        31
        33
        32
        33
        32
        34
        34
        35
        33
        33

15 rows selected.

SQL>

【讨论】:

  • 很可能,round() 在 OP 的尝试中也是错误的。端点(31 和 35)将以其他值的一半频率生成。正确的方法(假设需要均匀分布)是使用trunc()dbms_random.value() 有帮助,因为它生成的值 >= 下限和 trunc(dbms_random.value(31, 36) - 请注意上限是 36,而不是 35。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2014-12-19
  • 2014-03-20
  • 1970-01-01
相关资源
最近更新 更多