J'écris une procédure où chaque appel dont il a besoin pour obtenir un seul nombre aléatoire. Cette procédure est appelée depuis notre service web .net.SqlServer Rand() question
J'ai essayé d'implémenter cela en utilisant rand(). Toutefois, lorsque j'ai plusieurs appels à la procédure stockée en quelques millisecondes, j'obtiens beaucoup de collisions en ce que le même nombre aléatoire est généré. S'il y a un espace d'environ 20 ou 30 ms entre les appels suivants, cela semble fonctionner.
Il semble que rand() soit réanimé chaque appel de procédure stockée par SqlServer. D'après ce que je comprends c'est un problème car on devrait semer un générateur de nombres aléatoires une fois et qu'on n'obtient pas une bonne séquence de nombres pseudo-aléatoires si l'on réensemence chaque appel à rand. En outre, il semble que les appels à la même sp qui sont dans les 1 ou 2 millisecondes sont ensemencés avec la même valeur.
Voici l'instruction elle-même dans la procédure stockée.
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)
Quelqu'un at-il une suggestion pour résoudre ce problème? Est-ce que je devrai écrire mon propre générateur de nombres aléatoires qui est ensemencé une fois et enregistrer son état dans une table à travers les appels? Comment SQL Server crée-t-il rand()? Est-ce vraiment aléatoire ou si vous appelez un sp à 1 ou 2 millisecondes l'un de l'autre sur des connexions séparées sera-t-il ensemencé avec la même graine causant une collision?
Avez-vous essayé d'écrire une procédure stockée CLR et utilisez la capacité de nombre aléatoire du framework .NET? – Kuberchaun