1

我正在使用 Oracle 数据库 12c。有没有办法像我们在 C++ (urand()) 中那样生成均匀分布的浮点数?

或任何可以这样做的子程序。DBMS_RANDOM 包具有正态分布但不具有均匀分布的功能

4

1 回答 1

2

DBMS_RANDOM.VALUE生成均匀分布的值。

虽然手册没有明确说明如何VALUE随机化数字,但我认为我们可以确信它使用均匀分布,因为:

  1. 这是最简单的方法,并且已经有另一个函数可以提供标准化分布。
  2. 下面的快速测试用例验证数字看起来是均匀分布的。

对于测试,设置一个种子,以便每个人的结果都匹配:

begin
    dbms_random.seed(val => 'abcd');
end;
/

对于测试代码,生成 100,000 个随机值,对它们进行计数,然后将它们放入四舍五入的桶中:

--Compare DBMS_RANDOM.NORMAL and DBMS_RANDOM.VALUE.
select normal_value, normal_count, value_count
from
(
    --NORMAL
    select round(random_value, 1) normal_value, count(*) normal_count
    from
    (
        select
            dbms_random.normal random_value
        from dual
        connect by level <= 100000
    )
    group by round(random_value, 1)
    order by normal_value
) normal_values
join
(
    --VALUE
    select round(random_value, 1) value_value, count(*) value_count
    from
    (
        select
            dbms_random.value(-3,3) random_value
        from dual
        connect by level <= 100000
    )
    group by round(random_value, 1)
    order by value_value
) value_values
on normal_values.normal_value = value_values.value_value
order by 1;

将值导出到 LibreOffice,然后您也可以生成这个丑陋的图表:

在此处输入图像描述

于 2017-12-23T05:15:54.083 回答