Мне нужно другое случайное число для каждой строки в моей таблице. Следующий, казалось бы, очевидный код использует одно и то же случайное значение для каждой строки.
SELECT table_name, RAND() magic_number
FROM information_schema.tables
Я хотел бы получить INT или FLOAT из этого. В остальной части истории я собираюсь использовать это случайное число, чтобы создать случайное смещение даты от известной даты, например, 1-14 дней от даты начала.
Это для Microsoft SQL Server 2000.
sql-server
tsql
sql-server-2000
MatthewMartin
источник
источник
Ответы:
Взгляните на SQL Server - установите случайные числа на основе, которые имеют очень подробное объяснение.
Подводя итог, следующий код генерирует случайное число от 0 до 13 включительно с равномерным распределением:
Чтобы изменить свой диапазон, просто измените число в конце выражения. Будьте особенно осторожны, если вам нужен диапазон, который включает как положительные, так и отрицательные числа. Если вы сделаете это неправильно, можно удвоить число 0.
Небольшое предупреждение для математических орехов в комнате: в этом коде есть небольшое смещение.
CHECKSUM()
результаты в числах, которые являются одинаковыми по всему диапазону типа данных sql Int, или, по крайней мере, настолько близкими, насколько может показать мое (редакторское) тестирование. Однако будет некоторое смещение, когда CHECKSUM () выдаст число в самом верхнем конце этого диапазона. Каждый раз, когда вы получаете число между максимально возможным целым числом и последним точным кратным размера желаемого диапазона (в данном случае 14) перед этим максимальным целым числом, эти результаты предпочтительнее по сравнению с оставшейся частью вашего диапазона, которая не может быть получена из это последнее кратное 14.Например, представьте, что весь диапазон типа Int равен только 19. 19 - максимально возможное целое число, которое вы можете удерживать. Когда CHECKSUM () приводит к 14-19, они соответствуют результатам 0-5. Эти цифры будут сильно предпочитать 6-13, потому что СУММА () в два раза больше шансов для их создания . Это проще продемонстрировать визуально. Ниже представлен весь возможный набор результатов для нашего воображаемого целочисленного диапазона:
Вы можете видеть здесь, что есть больше шансов произвести некоторые числа, чем другие: смещение. К счастью, фактический диапазон типа Int намного больше ... настолько, что в большинстве случаев смещение почти не обнаружено. Однако об этом следует знать, если вы когда-нибудь обнаружите, что делаете это для серьезного кода безопасности.
источник
При вызове несколько раз в одном пакете rand () возвращает один и тот же номер.
Я бы предложил использовать convert (
varbinary
,newid()
) в качестве аргумента seed:newid()
гарантированно будет возвращать разные значения при каждом вызове, даже в пределах одного и того же пакета, поэтому использование его в качестве начального числа приведет к тому, что rand () выдаст другое значение каждый раз.Отредактировано, чтобы получить случайное целое число от 1 до 14.
источник
Выше будет генерировать (псевдо) случайное число от 0 до 1, исключая. Если используется в выборе, поскольку начальное значение изменяется для каждой строки, оно генерирует новое случайное число для каждой строки (однако не гарантируется, что будет генерироваться уникальное число для каждой строки).
Пример в сочетании с верхним пределом 10 (производит числа 1 - 10):
Документация по Transact-SQL:
CAST()
: https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sqlRAND()
: http://msdn.microsoft.com/en-us/library/ms177610.aspxCHECKSUM()
: http://msdn.microsoft.com/en-us/library/ms189788.aspxNEWID()
: https://docs.microsoft.com/en-us/sql/t-sql/functions/newid-transact-sqlисточник
Генерация случайных чисел от 1000 до 9999 включительно:
«+1» - включить значения верхней границы (9999 для предыдущего примера)
источник
FLOOR(RAND(CHECKSUM(NEWID()))*(10000-1000)+1000)
Отвечая на старый вопрос, но этот ответ не был предоставлен ранее, и, надеюсь, это будет полезно для тех, кто находит эти результаты через поисковую систему.
В 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 () сгенерирует то же случайное число, если оно используется в запросе SELECT таблицы. То же самое относится, если вы используете семя для функции Rand. Альтернативный способ сделать это, используя это:
Получил отсюда информацию , которая очень хорошо объясняет проблему.
источник
У вас есть целочисленное значение в каждой строке, которое вы можете передать в качестве начального числа в функцию RAND?
Чтобы получить целое число от 1 до 14, я считаю, что это будет работать:
источник
RAND(<seed>)
не кажется слишком случайным для незначительных изменений в<seed>
. Например, быстрый тест, который я сделал: я позволил<seed>
184380, 184383, 184386, и соответствующиеRAND(<seed>)
значения были: 0,14912, 0,14917, 0,14923.RAND(<seed>)*100000) - FLOOR(RAND(<seed>)*100000)
Если вам нужно сохранить начальное число, чтобы оно каждый раз генерировало «одинаковые» случайные данные, вы можете сделать следующее:
1. Создайте представление, которое возвращает select rand ()
2. Создайте UDF, который выбирает значение из представления.
3. Прежде чем выбирать ваши данные, запустите функцию rand (), а затем используйте UDF в вашем операторе select.
источник
попробуйте использовать начальное значение в RAND (seedInt). RAND () будет выполняться только один раз для каждого оператора, поэтому каждый раз вы видите одно и то же число.
источник
RIGHT(CONVERT(BIGINT, RAND(RecNo) * 1000000000000), 2)
(примечание: я вижуRIGHT
неявно преобразоватьBIGINT
вCHAR
, но быть строгим, вы бы другаяCONVERT
там).Если вам не нужно, чтобы это было целое число, а какой-либо случайный уникальный идентификатор, вы можете использовать
newid()
источник
Вам нужно будет вызвать RAND () для каждой строки. Вот хороший пример
https://web.archive.org/web/20090216200320/http://dotnet.org.za/calmyourself/archive/2007/04/13/sql-rand-trap-same-value-per-row.aspx
источник
RAND()
в представление, помещает егоSELECT
в функцию, а затем вызывает функцию из любого места. Умная.Здесь случайное число будет находиться в диапазоне от 20 до 30. Это
round
даст максимум два знака после запятой.Если вы хотите отрицательные числа, вы можете сделать это с
Тогда минимальное значение будет -60, а максимальное - -50.
источник
Это так же просто, как:
И это поместит в таблицу случайное число от 0 до 99:
источник
Проблема, с которой я иногда сталкиваюсь с выбранным «Ответом», заключается в том, что распределение не всегда равномерное. Если вам нужно очень равномерное распределение случайных чисел от 1 до 14 среди большого количества строк, вы можете сделать что-то вроде этого (моя база данных имеет 511 таблиц, так что это работает. Если у вас меньше строк, чем у диапазона случайных чисел, это не работает хорошо):
Этот вид противоположен нормальным случайным решениям в том смысле, что он поддерживает последовательность чисел и рандомизирует другой столбец.
Помните, у меня есть 511 таблиц в моей базе данных (что касается только b / c, который мы выбираем из information_schema). Если я беру предыдущий запрос и помещаю его во временную таблицу #X, а затем запускаю этот запрос для полученных данных:
Я получаю этот результат, показывая, что мое случайное число ОЧЕНЬ равномерно распределено по множеству строк:
источник
всегда работал на меня
источник
Используйте newid ()
или возможно это
источник
источник
Попробуй это:
Где
a
нижнее число иb
верхнее числоисточник
Число от 1 до 10.
источник