Я пишу процедуру, в которой для каждого вызова необходимо получить одно случайное число. Эта процедура вызывается из нашего веб-сервиса .net.
Я пытался реализовать это с помощью rand (). Однако, когда у меня есть несколько вызовов хранимой процедуры в течение миллисекунд, я получаю много коллизий в связи с тем, что генерируется одно и то же случайное число. Если между последующими вызовами есть промежуток около 20 или 30 мс, он работает нормально.
Похоже, что rand () повторяется при каждом вызове хранимой процедуры SqlServer. Из того, что я понимаю, это проблема, потому что нужно запустить генератор случайных чисел один раз, и он не получит хорошую последовательность псевдослучайных чисел, если каждый повторяет каждый вызов rand. Кроме того, кажется, что вызовы к тому же sp, которые находятся в пределах 1 или 2 миллисекунд, засеваются с тем же значением.
Вот сама инструкция в хранимой процедуре.
DECLARE @randomNumber char(9)
SET @randomNumber = RIGHT('00000' + CAST(CAST(rand()*100000 AS INT) AS VARCHAR(5)),5)
+ RIGHT('00000' + CAST(CAST(rand()*10000 AS INT) AS VARCHAR(4)),4)
У кого-нибудь есть предложения по исправлению?
Должен ли я написать свой собственный генератор случайных чисел, который будет посеян один раз и сохранит свое состояние в таблице между вызовами? Как SQL Server затравливает rand ()? Это действительно случайно или если вы вызываете sp в течение 1 или 2 миллисекунд друг от друга на отдельных соединениях, будет ли он засеян одним и тем же семенем, вызывая столкновение?