Я искал ответ в Swift 3, и этот вопрос был показан в качестве первого результата поиска, и меня вдохновляет ответ, поэтому вот код SWIFT 3
let array: [String] = nsMutableArrayObject.copy() as! [String]
Взгляните на 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 намного больше ... настолько, что в большинстве случаев смещение практически невозможно обнаружить. Однако об этом следует помнить, если вы когда-нибудь обнаружите, что делаете это из-за серьезного кода безопасности.
Если вам нужно не целое число, а любой случайный уникальный идентификатор, вы можете использовать newid ()
SELECT table_name, newid() magic_number
FROM information_schema.tables
select newid ()
или, возможно, этот select binary_checksum (newid ())
Вам нужно будет вызвать RAND () для каждой строки. Вот хороший пример
Функция Rand () генерирует то же случайное число, если используется в запросе SELECT для таблицы. То же самое применимо, если вы используете семя для функции Rand. Альтернативный способ сделать это - использовать следующее:
SELECT ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber]
Получил информацию из здесь , которая очень хорошо объясняет проблему.
У вас есть целочисленное значение в каждой строке, которое вы могли бы передать в качестве начального числа в функцию RAND?
Чтобы получить целое число от 1 до 14, я думаю, это сработает:
FLOOR( RAND(<yourseed>) * 14) + 1
При многократном вызове в одном пакете 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.
попробуйте использовать начальное значение в RAND (seedInt). RAND () выполняется только один раз для каждого оператора, поэтому каждый раз вы видите одно и то же число.