Urand в базе данных Oracle

Я использую Oracle Database 12c. Есть ли способ генерировать равномерно распределенные числа с плавающей запятой, как у нас в C ++ (urand ())?

Или любая подпрограмма, которая могла бы сделать это. Пакет DBMS_RANDOM имеет функциональность для нормального распределения, но не для равномерного распределения

1

Решение

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, и тогда вы тоже сможете сгенерировать этот уродливый график:

введите описание изображения здесь

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]