Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Получить "случайные" числа из заданого диапазона  [new]
Testor1
Member

Откуда:
Сообщений: 679
Привет всем!

Посоветуйте способ получения "максимально случайных" чисел в заданном диапазоне посредством tsql

Например нужно получить случайные целые числа в диапазоне 1-100.
20 дек 18, 21:44    [21770071]     Ответить | Цитировать Сообщить модератору
 Re: Получить "случайные" числа из заданого диапазона  [new]
vikkiv
Member

Откуда: London
Сообщений: 2704
Testor1,

поискать по форуму, периодически возникающий вопрос
(а уж гугл зашкаливает, в том числе схожими что ниже трафаретными решениями)

простейший вариант :функция RAND() генерирует плоское распределение в диапазоне от 0 до 1
тебе нужно этот диапазон (ровно) растянуть от a до b
т.е. 0 поднять до a (следовательно начиная с а),
и всё до единицы растянуть до b (т.е. b*rand())

например основные сценарии для диапазона от а=5 до b=23:
rand() выдал ноль (нижнее) или единицу (верхнее) значения
при нуле: a+rand() = 5+0 = 5 (т.е. нижняя граница диапазона)
а при единице: b*rand() = 23*1 = 23
формула объединяющая оба условия будет
(для перехода между двумя системами координат: 0~1 и a~b будет фактически прямой с изменяемым углом наклона и координатой пересечения с осью)
(b-а)*rnd + а
проверка
rand()=0: (23-5)*0 + 5 = 5
rand()=1: (23-5)*1 + 5 = 23
т.е. можно обойтись различными вариациями в данном случае параметризированной формы (@b-@a)*rand()+@a с подгонкой под желаемый тип данных

для целых чисел нужно сохранить плоскость распределения по краям, добиться этого
(обычно приемлемого результата) можно с помощью сдвига верхней границы на +1
(иначе верхняя граница будет практически невероятным событием на длинных диапазонах)
т.е. в твоём случае если пренебречь вероятностью получения через rand() единицы
(шанс получить приближается к нулю, но он есть, если заменишь rand() на 1 то выскочишь из заданного диапазона):
declare @low int=5,@up int=7
select floor(rand()*(@up-@low+1)+@low)x
есть вариации с использованием вместо floor() функций round() или ceiling()

дальше зависит от области и нюансов применения
есть и другие встроенные SQL функции приводящие к схожим результатам (с ходу: CRYPT_GEN_RANDOM() , NEWID() ..)
так-же есть специфика по работе только с целыми значениями, какой-то удобный диапазон (от 0 до 100 или до 1000), для каждой строки или один раз за выполнение запроса,
требования к форме/линейности распределения, пожелания по производительности и т.д.
20 дек 18, 22:47    [21770134]     Ответить | Цитировать Сообщить модератору
 Re: Получить "случайные" числа из заданого диапазона  [new]
vikkiv
Member

Откуда: London
Сообщений: 2704
P.S. кстати у тебя диапазон почти кратный, после простого умножения 10^n к линейности по правилам lg() можно привести.
можно ещё подшаманить с краями и сам rand() параметризовать, тогда добавив дополнительное условие на проверку = 1 можно в зависимости от приемлемой точности исключить (например через если = 1 то отнять -0.000000001 вылетание за границы)
20 дек 18, 23:03    [21770136]     Ответить | Цитировать Сообщить модератору
 Re: Получить "случайные" числа из заданого диапазона  [new]
komrad
Member

Откуда:
Сообщений: 5245
Testor1
Привет всем!

Посоветуйте способ получения "максимально случайных" чисел в заданном диапазоне посредством tsql

Например нужно получить случайные целые числа в диапазоне 1-100.


кстати, надо быть готовым к тому, что случайные числа могут повторяться.
например: 1,9,13,6,6,5 и т.п.

случайность не гарантирует неповторяемость подряд
21 дек 18, 00:06    [21770149]     Ответить | Цитировать Сообщить модератору
 Re: Получить "случайные" числа из заданого диапазона  [new]
vikkiv
Member

Откуда: London
Сообщений: 2704
komrad,

случайные числа и последовательность случайных чисел - понятия различающиеся
21 дек 18, 00:27    [21770154]     Ответить | Цитировать Сообщить модератору
 Re: Получить "случайные" числа из заданого диапазона  [new]
komrad
Member

Откуда:
Сообщений: 5245
vikkiv
komrad,

случайные числа и последовательность случайных чисел - понятия различающиеся

не спорю с данным утверждением
это скорей автору на заметку
21 дек 18, 00:42    [21770158]     Ответить | Цитировать Сообщить модератору
 Re: Получить "случайные" числа из заданого диапазона  [new]
aleks222
Member

Откуда:
Сообщений: 985
vikkiv
komrad,

случайные числа и последовательность случайных чисел - понятия различающиеся

С этого места подробнее! Я записываю!!!
21 дек 18, 05:27    [21770186]     Ответить | Цитировать Сообщить модератору
 Re: Получить "случайные" числа из заданого диапазона  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7768
имо последовательности бывают только псевдослучайных.
21 дек 18, 13:56    [21770470]     Ответить | Цитировать Сообщить модератору
 Re: Получить "случайные" числа из заданого диапазона  [new]
aleks222
Member

Откуда:
Сообщений: 985
Владислав Колосов
имо последовательности бывают только псевдослучайных.

Ты не прав, брут.

Кидай монетку и записывай.
21 дек 18, 13:58    [21770471]     Ответить | Цитировать Сообщить модератору
 Re: Получить "случайные" числа из заданого диапазона  [new]
Testor1
Member

Откуда:
Сообщений: 679
vikkiv,

Статей реально много, а вот найти качественный генератор случайных чисел для диапазона очень сложно :(
23 дек 18, 01:09    [21771243]     Ответить | Цитировать Сообщить модератору
 Re: Получить "случайные" числа из заданого диапазона  [new]
Testor1
Member

Откуда:
Сообщений: 679
Пока вот что-то такое использую, но думал, что есть что-то получше

SET @rn = FLOOR(RAND(CAST(CRYPT_GEN_RANDOM(4) AS INT))*(@numbers)+1);
23 дек 18, 01:12    [21771244]     Ответить | Цитировать Сообщить модератору
 Re: Получить "случайные" числа из заданого диапазона  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36980
Testor1
Пока вот что-то такое использую, но думал, что есть что-то получше

SET @rn = FLOOR(RAND(CAST(CRYPT_GEN_RANDOM(4) AS INT))*(@numbers)+1);
И какой же у вас критерий лучшести?
23 дек 18, 01:56    [21771256]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить