Comment puis-je remplir une colonne de nombres aléatoires dans SQL? J'obtiens la même valeur dans chaque ligne
UPDATE CattleProds
SET SheepTherapy=(ROUND((RAND()* 10000),0))
WHERE SheepTherapy IS NULL
Si je puis faire un SELECT je vois que mon nombre aléatoire est identique dans chaque ligne. Toutes les idées sur la façon de générer des nombres aléatoires?
Vous devez vous connecter pour publier un commentaire.
Au lieu de
rand()
, utiliseznewid()
, qui est recalculé pour chaque ligne du résultat. La méthode habituelle consiste à utiliser le modulo de la somme de contrôle. Notez quechecksum(newid())
peut produire de -2 147 483 648 et provoquer de débordement d'entier surabs()
, donc nous avons besoin d'utiliser le modulo sur la somme de contrôle valeur de retour avant de le convertir à une valeur absolue.Cela génère un nombre aléatoire entre 0 et 9999.
Si vous êtes sur un Serveur SQL server 2008, vous pouvez également utiliser
Qui semble un peu plus simple (il est également évaluée une fois par ligne comme
newid
est - illustré ci-dessous)Retourne (2 aléatoire probablement différents numéros)
Ressasser la inexpliquée downvote la seule raison légitime, je pense que, parce que le nombre aléatoire généré est entre 0-65535 qui n'est pas divisible par 10 000 certains numéros seront légèrement sur-représentées. Un moyen de contourner ce serait l'envelopper dans un scalaire de l'UDF, qui jette un nombre de plus de 60 000 personnes et appelle récursivement pour obtenir un nouveau numéro.
Pendant que je fais l'amour à l'aide de la somme de contrôle, je pense qu'une meilleure façon d'aller de l'est à l'aide de
NEWID()
, juste parce que vous n'avez pas à passer par un complexe de mathématiques pour générer des nombres simples .Vous pouvez remplacer le
1000
avec n'importe quel numéro que vous souhaitez définir comme la limite, et vous pouvez toujours utiliser un signe plus pour créer une gamme, disons que vous voulez un nombre aléatoire entre100
et200
, vous pouvez faire quelque chose comme :De les mettre ensemble dans votre requête :
J'ai testé 2 définir en fonction des méthodes de randomisation contre RAND() par la génération de 100,000,000 lignes avec chaque. Au niveau de la sortie est un flottant entre 0 et 1 pour imiter RAND(). La plupart du code est l'infrastructure de test donc je résume les algorithmes ici:
À l'aide de CRYPT_GEN_RANDOM était clairement le plus aléatoire, car il n'existe qu'un .000000001% de chance de voir même 1 en double lors de la cueillette 10^8 numéros à PARTIR d'un ensemble de 10^18 numéros. OIE nous ne devrions pas avoir vu tous les doublons et ce n'en avaient pas! Ce jeu de 44 secondes pour générer sur mon ordinateur portable.
D'Exécution de SQL Server Fois:
Le temps CPU = 134795 ms, temps écoulé = 39274 ms.
À près de 15 ordres de grandeur moins de hasard, cette méthode n'était pas tout à fait deux fois plus rapide, en seulement 23 secondes pour générer 100 M des nombres.
D'Exécution de SQL Server Fois:
Le temps CPU = 77156 ms, temps écoulé = 24613 ms.
RAND() seul est inutile pour la génération de la création de la base de référence pour comparer l'aléatoire a pris plus de 6 heures et a dû être redémarré plusieurs fois pour enfin obtenir le bon nombre de lignes de sortie. Il semble également que l'aléatoire laisse beaucoup à désirer bien que c'est mieux que d'utiliser de la somme de contrôle(newid()) afin de réamorcer chaque ligne.
En raison de la redémarre, le temps d'exécution n'a pas pu être capturé.