Как я генерирую случайное число для каждой строки в Выборе TSQL?

Я искал ответ в Swift 3, и этот вопрос был показан в качестве первого результата поиска, и меня вдохновляет ответ, поэтому вот код SWIFT 3

let array: [String] = nsMutableArrayObject.copy() as! [String]
311
задан rjose 27 June 2018 в 03:13
поделиться

8 ответов

Взгляните на SQL Server - Набор случайных чисел на основе , который имеет очень подробное объяснение.

Подводя итог, следующий код генерирует случайное число от 0 до 13 включительно с нормализованным распределением:

ABS(CHECKSUM(NewId())) % 14

Чтобы изменить диапазон, просто измените число в конце выражения. Будьте особенно осторожны, если вам нужен диапазон, включающий как положительные, так и отрицательные числа. Если вы сделаете это неправильно, можно дважды подсчитать число 0.

Небольшое предупреждение для математических фанатов в комнате: в этом коде есть очень небольшая ошибка. CHECKSUM () приводит к числам, которые одинаковы во всем диапазоне типа данных sql Int, или, по крайней мере, настолько близки к тому, что может показать мое (редакторское) тестирование. Тем не мение, будет некоторая предвзятость, когда CHECKSUM () выдает число в самом верхнем конце этого диапазона. Каждый раз, когда вы получаете число между максимально возможным целым числом и последним точным кратным размера вашего желаемого диапазона (14 в данном случае) перед этим максимальным целым числом, эти результаты имеют преимущество перед оставшейся частью вашего диапазона, которая не может быть получена из последнее кратное 14.

В качестве примера представьте, что весь диапазон типа Int составляет только 19. 19 - это наибольшее возможное целое число, которое вы можете удерживать. Когда КОНТРОЛЬНАЯ СУММА () дает 14-19, они соответствуют результатам 0-5. Эти числа будут в значительной степени предпочтительнее 6-13, потому что CHECKSUM () сгенерирует их в два раза чаще. Это проще продемонстрировать наглядно. Ниже представлен весь возможный набор результатов для нашего воображаемого целочисленного диапазона:

Checksum Integer: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Range Result:     0 1 2 3 4 5 6 7 8 9 10 11 12 13  0  1  2  3  4  5

Здесь вы можете видеть, что существует больше шансов получить одни числа, чем другие: систематическая ошибка. К счастью, фактический диапазон типа Int намного больше ... настолько, что в большинстве случаев смещение практически невозможно обнаружить. Однако об этом следует помнить, если вы когда-нибудь обнаружите, что делаете это из-за серьезного кода безопасности.

492
ответ дан 23 November 2019 в 01:12
поделиться

Если вам нужно не целое число, а любой случайный уникальный идентификатор, вы можете использовать newid ()

SELECT table_name, newid() magic_number 
FROM information_schema.tables
4
ответ дан 23 November 2019 в 01:12
поделиться

select newid ()

или, возможно, этот select binary_checksum (newid ())

2
ответ дан 23 November 2019 в 01:12
поделиться

Вам нужно будет вызвать RAND () для каждой строки. Вот хороший пример

https://web.archive.org/web/20090216200320/http://dotnet.org.za/calmyourself/archive/2007/04/13/sql-rand-trap-same- value-per-row.aspx

4
ответ дан 23 November 2019 в 01:12
поделиться

Функция Rand () генерирует то же случайное число, если используется в запросе SELECT для таблицы. То же самое применимо, если вы используете семя для функции Rand. Альтернативный способ сделать это - использовать следующее:

SELECT ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber]

Получил информацию из здесь , которая очень хорошо объясняет проблему.

13
ответ дан 23 November 2019 в 01:12
поделиться

У вас есть целочисленное значение в каждой строке, которое вы могли бы передать в качестве начального числа в функцию RAND?

Чтобы получить целое число от 1 до 14, я думаю, это сработает:

FLOOR( RAND(<yourseed>) * 14) + 1
5
ответ дан 23 November 2019 в 01:12
поделиться

При многократном вызове в одном пакете rand () возвращает одно и то же число.

Я бы предложил использовать convert ( varbinary , newid ( ) ) в качестве начального аргумента:

SELECT table_name, 1.0 + floor(14 * RAND(convert(varbinary, newid()))) magic_number 
FROM information_schema.tables

newid () гарантированно будет возвращать другое значение каждый раз, когда он вызывается, даже в пределах одного и того же пакета, поэтому использование его в качестве начального аргумента побудит rand () предоставить каждый раз другое значение.

Отредактировано для получения случайного целого числа от 1 до 14.

92
ответ дан 23 November 2019 в 01:12
поделиться

попробуйте использовать начальное значение в RAND (seedInt). RAND () выполняется только один раз для каждого оператора, поэтому каждый раз вы видите одно и то же число.

4
ответ дан 23 November 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: