Я использую Oracle Database 12c. Есть ли способ генерировать равномерно распределенные числа с плавающей запятой, как у нас в C ++ (urand ())?
Или любая подпрограмма, которая могла бы сделать это. Пакет DBMS_RANDOM имеет функциональность для нормального распределения, но не для равномерного распределения
DBMS_RANDOM.VALUE
генерирует значения в равномерном распределении.
Хотя руководство прямо не указано, как VALUE
рандомизировать числа, я думаю, мы можем быть уверены, что он использует равномерное распределение, потому что:
Для теста установите начальное значение, чтобы результаты у всех совпадали:
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, и тогда вы тоже сможете сгенерировать этот уродливый график:
Других решений пока нет …