powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Получить "случайные" числа из заданого диапазона
12 сообщений из 12, страница 1 из 1
Получить "случайные" числа из заданого диапазона
    #39751063
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!

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

Например нужно получить случайные целые числа в диапазоне 1-100.
...
Рейтинг: 0 / 0
Получить "случайные" числа из заданого диапазона
    #39751076
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 то выскочишь из заданного диапазона):
Код: sql
1.
2.
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), для каждой строки или один раз за выполнение запроса,
требования к форме/линейности распределения, пожелания по производительности и т.д.
...
Рейтинг: 0 / 0
Получить "случайные" числа из заданого диапазона
    #39751078
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. кстати у тебя диапазон почти кратный, после простого умножения 10^n к линейности по правилам lg() можно привести.
можно ещё подшаманить с краями и сам rand() параметризовать, тогда добавив дополнительное условие на проверку = 1 можно в зависимости от приемлемой точности исключить (например через если = 1 то отнять -0.000000001 вылетание за границы)
...
Рейтинг: 0 / 0
Получить "случайные" числа из заданого диапазона
    #39751086
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1Привет всем!

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

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

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

случайность не гарантирует неповторяемость подряд
...
Рейтинг: 0 / 0
Получить "случайные" числа из заданого диапазона
    #39751089
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad,

случайные числа и последовательность случайных чисел - понятия различающиеся
...
Рейтинг: 0 / 0
Получить "случайные" числа из заданого диапазона
    #39751092
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkivkomrad,

случайные числа и последовательность случайных чисел - понятия различающиеся
не спорю с данным утверждением
это скорей автору на заметку
...
Рейтинг: 0 / 0
Получить "случайные" числа из заданого диапазона
    #39751113
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkivkomrad,

случайные числа и последовательность случайных чисел - понятия различающиеся
С этого места подробнее! Я записываю!!!
...
Рейтинг: 0 / 0
Получить "случайные" числа из заданого диапазона
    #39751311
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имо последовательности бывают только псевдослучайных.
...
Рейтинг: 0 / 0
Получить "случайные" числа из заданого диапазона
    #39751312
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовимо последовательности бывают только псевдослучайных.
Ты не прав, брут.

Кидай монетку и записывай.
...
Рейтинг: 0 / 0
Получить "случайные" числа из заданого диапазона
    #39751770
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vikkiv,

Статей реально много, а вот найти качественный генератор случайных чисел для диапазона очень сложно :(
...
Рейтинг: 0 / 0
Получить "случайные" числа из заданого диапазона
    #39751771
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока вот что-то такое использую, но думал, что есть что-то получше

SET @rn = FLOOR(RAND(CAST(CRYPT_GEN_RANDOM(4) AS INT))*(@numbers)+1);
...
Рейтинг: 0 / 0
Получить "случайные" числа из заданого диапазона
    #39751776
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1Пока вот что-то такое использую, но думал, что есть что-то получше

SET @rn = FLOOR(RAND(CAST(CRYPT_GEN_RANDOM(4) AS INT))*(@numbers)+1);И какой же у вас критерий лучшести?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Получить "случайные" числа из заданого диапазона
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]