Я редко использую случайные числа, поэтому, когда они требуются, мне приходится возвращаться и вспоминать. Возможно, написание поста на эту тему задержат их в моей памяти подольше.
Функция RAND
Первый способ сгенерировать случайное число — это использование функции RAND в SQL Server. Она возвращает значение типа float. Например:
Если вам нужно с помощью функции RAND получить число от 1 до 10 вместо значения float, вы можете использовать подобный запрос:
Вы можете выполнить тесты, чтобы увидеть, каким может быть случайное распределение чисел. Попробуйте выполнить это и посмотреть, насколько случайны наши числа:
В конечном итоге они распределяются довольно равномерно.
Функция NEWID
Другой функцией, которая используется для получения случайных чисел, является NEWID(). Если нам так же нужно случайное число между 1 и 10:
Функция ABS() используется для получения абсолютного числа. Без нее числа в данном примере будут лежать в диапазоне между -8 и 10. Если подставить этот запрос в наш тестовый скрипт выше, мы получим подобные результаты:
Этот метод также дает довольно равномерное распределение.
Это способ, которым я получаю случайные числа. Если попытаетесь сделать что-то подобное для присвоения случайных номеров строкам в таблице, RAND сам по себе даст вам один и тот же номер для каждой строки. Вы должны быть осторожнее с такими сценариями.
Обратные ссылки
Комментарии
Показывать комментарии Как список | Древовидной структурой
Автор не разрешил комментировать эту запись
RAND (Transact-SQL)
Применимо к: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics
Возвращает псевдослучайное значение типа float от 0 до 1.
Синтаксические обозначения в Transact-SQL
Синтаксис
Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.
Этот синтаксис не поддерживается бессерверным пулом SQL в Azure Synapse Analytics.
Аргументы
seed
Целочисленное выражение (tinyint, smallint или int), задающее начальное значение. Если аргумент seed не указан, компонент Компонент SQL Server Database Engine использует случайное начальное значение. Для указанного начального значения возвращаемый результат всегда будет один и тот же.
Типы возвращаемых данных
Remarks
Повторные вызовы RAND() с одинаковым начальным значением возвращают одинаковые результаты.
Для одного соединения, если RAND() вызван с конкретным начальным значением, все последующие вызовы RAND() выдадут результат, основанный на начальном вызове RAND(). Например, следующий запрос всегда будет возвращать ту же последовательность чисел.
Примеры
Следующий пример выдает четыре различных случайных числа, сформированных функцией RAND.
Как генерировать случайное число для каждой строки в TSQL Select?
Мне нужно другое случайное число для каждой строки в моей таблице. Следующий, казалось бы, очевидный код использует одно и то же случайное значение для каждой строки.
Я хотел бы получить INT или FLOAT из этого. Остальная часть истории-я собираюсь использовать это случайное число для создания случайного смещения даты от известной даты, например, 1-14 дней от даты начала.
Это для Microsoft SQL Server 2000.
16 ответов
посмотри SQL Server-набор случайных чисел на основе, который имеет очень подробное объяснение.
подводя итог, следующий код генерирует случайное число от 0 до 13 включительно с нормализованным распределением:
Читайте также: Разъем генератора киа рио
изменить свой выбор, просто измените число в конце выражения. Будьте очень осторожны, если вам нужен диапазон, который включает как положительные, так и отрицательные числа. Если вы сделаете это неправильно, можно дважды пересчитать число 0.
небольшое предупреждение для математических орехов в комнате: в этом коде очень небольшое смещение. CHECKSUM() результаты в числах, которые одинаковы во всем диапазоне типа данных sql Int или, по крайней мере, так близко, как может показать мое (редактор) тестирование. Однако будет некоторое смещение, когда CHECKSUM() создает число в самом верхнем конце этого диапазона. Каждый раз, когда вы получаете число между максимально возможным целым числом и последним точным кратным размеру желаемого диапазона (14 в этом случае) перед этим максимальным целым числом эти результаты предпочтительнее остальной части диапазона, которая не может быть получена из последнего кратного 14.
в качестве примера представьте, что весь диапазон типа Int составляет всего 19. 19-это максимальное целое число, которое вы можете провести. Когда контрольная сумма() приводит к 14-19, они соответствуют результатам 0-5. Эти цифры будут сильно предпочтительнее 6-13, потому что контрольная сумма () в два раза чаще генерирует их. Это легче продемонстрировать визуально. Ниже приведен весь возможный набор результатов для нашего мнимого целого диапазона:
вы можете видеть здесь, что есть больше шансов произвести некоторые числа, чем другие: смещение. К счастью, фактический диапазон типа Int много больше. настолько, что в большинстве случаев предубеждение почти незаметно. Тем не менее, это то, что нужно знать, если вы когда-нибудь обнаружите, что делаете это для серьезного кода безопасности.
при вызове несколько раз в одном пакете rand() возвращает один и тот же номер.
Я бы предложил использовать convert ( varbinary , newid() ) в качестве аргумента семя:
newid() гарантированно возвращает другое значение каждый раз, когда оно вызывается, даже в одной и той же партии, поэтому использование его в качестве семени предложит rand() каждый раз давать другое значение.
отредактировано, чтобы получить случайное целое число от 1 до 14.
выше будет генерировать (псевдо-) случайное число между 0 и 1, эксклюзив. Если используется в select, поскольку начальное значение изменяется для каждой строки, оно генерирует новое случайное число для каждой строки (однако не гарантируется создание уникального числа для каждой строки).
пример в сочетании с верхним пределом 10 (производит числа 1-10):
документация по Transact-SQL:
генерация случайных чисел от 1000 до 9999 включительно:
«+1 » — для включения значений верхней границы(9999 для предыдущего примера)
отвечая на старый вопрос, но этот ответ не был предоставлен ранее, и, надеюсь, это будет полезно для кого-то найти эти результаты через поисковую систему.
С SQL Server 2008 была введена новая функция, CRYPT_GEN_RANDOM(8) , который использует CryptoAPI для создания криптографически сильного случайного числа, возвращаемого как VARBINARY(8000) . Вот страница документации: https://docs.microsoft.com/en-us/sql/t-sql/functions/crypt-gen-random-transact-sql
чтобы получить случайное число, вы можете просто вызвать функцию и привести ее к нужному типу:
или float между -1 и +1, вы могли бы сделать что-то вроде этого:
функция Rand () будет генерировать то же случайное число, если используется в запросе выбора таблицы. То же самое относится, если вы используете seed для функции Rand. Альтернативный способ сделать это-использовать это:
Читайте также: Генератор замена подшипников авто
получил информацию от здесь, который очень хорошо объясняет проблему.
есть ли у вас целочисленное значение в каждой строке, которое вы могли бы передать как семя функции RAND?
чтобы получить целое число от 1 до 14, я считаю, что это сработает:
Если вам нужно сохранить свое семя, чтобы оно генерировало» одинаковые » случайные данные каждый раз, вы можете сделать следующее:
1. Создайте представление, которое возвращает select rand ()
2. Создайте UDF, который выбирает значение из представления.
3. Перед выбором данных выполните функцию rand (), а затем используйте UDF в инструкции select.
попробуйте использовать начальное значение в RAND (seedInt). RAND () будет выполняться только один раз за оператор, поэтому вы видите одно и то же число каждый раз.
Если вам не нужно, чтобы это было целое число, но любой случайный уникальный идентификатор, вы можете использовать newid()
вам нужно будет вызвать RAND () для каждой строки. Вот хороший пример
здесь случайное число будет находиться между 20 и 30. round даст максимум два десятичных знака.
Если вы хотите отрицательные числа, вы можете сделать это с
тогда минимальное значение будет -60, а максимальное -50.
или, возможно, это Выберите binary_checksum (newid ())
проблема, с которой я иногда сталкиваюсь с выбранным «ответом», заключается в том, что распределение не всегда равномерное. Если вам нужно очень равномерное распределение случайных 1-14 среди множества строк, вы можете сделать что-то вроде этого (моя база данных имеет 511 таблиц, поэтому это работает. Если у вас меньше строк, чем у вас случайный диапазон чисел, это не работает хорошо):
этот вид делает противоположное нормальным случайным решениям в том смысле, что он сохраняет последовательности чисел и рандомизирует другие колонна.
помните, что у меня есть 511 таблиц в моей базе данных (что относится только к b/c, который мы выбираем из information_schema). Если я беру предыдущий запрос и помещаю его во временную таблицу #X, а затем запускаю этот запрос на результирующих данных:
Я получаю этот результат, показывая мне, что мое случайное число очень равномерно распределено между многими строками:
Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
Базы данных
SQL Server функция RAND
В этом учебном пособии вы узнаете, как использовать функцию RAND в SQL Server (Transact-SQL) с синтаксисом и примерами.
Описание
В SQL Server (Transact-SQL) функция RAND может использоваться для возврата случайного числа или случайного числа в пределах диапазона.
Синтаксис
Синтаксис функции RAND в SQL Server (Transact-SQL):
Параметры или аргументы
param — необязательный. Если указано, он будет воспроизводить последовательность случайных чисел каждый раз, когда будет предоставлено начальное значение.
Случайный десятичный диапазон
Чтобы создать случайное десятичное число между двумя значениями (диапазон), вы можете использовать следующую формулу:
Где a — наименьшее число, а b — наибольшее число, для которого вы хотите создать случайное число.
Вышеприведенная формула создаст случайное десятичное число от 5 до 15.
Случайный целочисленный диапазон
Чтобы создать случайное целое число между двумя значениями (диапазон), вы можете использовать следующую формулу:
Где a — наименьшее число, а b — наибольшее число, для которого вы хотите создать случайное число.
Вышеприведенная формула генерирует случайное целое число от 5 до 15.
Читайте также: Генератор ключей продукта для windows 10
Применение
Функция RAND может использоваться в следующих версиях SQL Server (Transact-SQL):
SQL Server vNext, SQL Server 2016, SQL Server 2015, SQL Server 2014, SQL Server 2012, SQL Server 2008 R2, SQL Server 2008, SQL Server 2005
Пример случайного числа
Рассмотрим пример, как использовать функцию RAND в SQL Server (Transact-SQL) для генерации случайного числа от 0 до 1 включительно.
Например:
Случайная выборка строк из таблицы в SQL Server стр. 2
Попробуем теперь применить функцию RAND для нашей задачи, а именно, для выдачи двух случайным образом выбранных моделей:
Получаем первые две модели в порядке возрастания их номеров. Вот где проявилась псевдослучайность. Посмотрим, что за случайные числа мы имеем:
Для краткости приведу их не все:
Model | rnd |
---|
Я не знаю, какой алгоритм используется для вычисления случайного числа, однако могу утверждать, что функция RAND ведет себя монотонно в данном диапазоне номеров моделей. Потому у нас ничего и не получилось.
В Электронная документация SQL Server Books Online BOL приводится пример генерации последовательности случайных чисел с использованием системного времени, чтобы динамически менять начальное значение. Вот он:
Однако в таком виде запрос может быть задействован только в медленно выполняющихся пакетах, чтобы неоднократное выполнение запроса происходило не чаще, чем минимальная единица времени, применяемая в запросе (миллисекунды). Очевидно, что использование этой функции в выборке модели не будет отвечать этому условию. Однако если умножить аргумент на некоторый уникальный идентификатор, то мы можем добиться успеха (это решение было предложено Гершовичем В.И.):
Однако тут есть одна проблема, связанная с тем, что аргументом функции RAND является целое число. Поэтому если мы превысим максимально допустимое значение для целого числа (для Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server оно составляет 2^31-1 или 2 147 483 647), то получим следующее сообщение об ошибке:
Arithmetic overflow error converting expression to data type int.
(«Ошибка переполнения при преобразовании выражения к типу данных int».)
В этом можно убедиться, выполнив вышеприведенный запрос на сайте. Ошибка возникает где-то на номерах моделей, превышающих 2000. В аналогичных случаях нужен еще нормирующий множитель, например,
Здесь добавление model % 10 (остаток от деления на 10) делается для того, чтобы не потерять значащие цифры; в противном случае мы можем получить одинаковые значения для моделей, номера которых отличаются на единицы.
В окончательном виде решение будет выглядеть так (естественно, сортировку нужно делать по rnd, а не по model, которую мы оставили для наглядности результата).
А теперь сравните результаты:
model | Rnd |
---|
https://dmsht.ru/sql-generator-sluchaynyh-chisel