115 votes

Générer une valeur int aléatoire de 3 à 6

Est-il possible, dans Microsoft SQL Server, de générer une valeur aléatoire de Min à Max (3-9 par exemple, 15-99 etc.) ?

Je sais que je peux générer de 0 à Max, mais comment augmenter la frontière Min ?

Cette requête génère une valeur aléatoire de 1 à 6. J'ai besoin de la changer de 3 à 6.

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

Ajouté 5 secondes plus tard :

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

1 votes

La réponse que vous avez là ne fonctionne que si vous avez des droits de type administrateur sur la table. Pour contourner ce problème, j'ai utilisé la clé primaire du champ comme germe. La distribution n'était pas brillante, mais elle servait le but.

239voto

orgtigger Points 562

Un éditeur utile a ajouté le "Select" avant chaque déclaration, mais l'intérêt de cet élément est qu'il peut générer des clés uniques pour chaque ligne d'une déclaration, et pas seulement pour un élément (pour cela, j'utiliserais la fonction Rand()). Par exemple : Select top 100 Rand(),* from tblExample

renvoie la même valeur aléatoire pour les 100 lignes.

Alors que : Sélectionner les 100 premiers ABS(CHECKSUM(NEWID()) % 10),* de tblexample

Renvoie une valeur aléatoire différente entre 0 et 9 sur chaque ligne de la déclaration. Ainsi, bien que la sélection facilite le copier-coller, vous pouvez copier la logique dans une instruction de sélection si c'est ce qui est nécessaire.

Ceci génère un nombre aléatoire entre 0-9

SELECT ABS(CHECKSUM(NEWID()) % 10)

1 à 6

SELECT ABS(CHECKSUM(NEWID()) % 6) + 1

3 à 6

SELECT ABS(CHECKSUM(NEWID()) % 4) + 3

Dynamique (basé sur le commentaire d'Eilert Hjelmeseths - merci à jiraiya pour la présentation visuelle)

SELECT ABS(CHECKSUM(NEWID()) % (@max - @min + 1)) + @min

Mis à jour sur la base des commentaires :

  • NEWID génère une chaîne aléatoire (pour chaque ligne du retour)
  • CHECKSUM prend la valeur d'une chaîne de caractères et crée un nombre
  • module ( % ) divise par ce nombre et renvoie le reste (ce qui signifie que la valeur maximale est inférieure de un au nombre que vous avez utilisé).
  • ABS transforme les résultats négatifs en résultats positifs
  • puis ajouter un au résultat pour éliminer les résultats nuls (pour simuler un jet de dé).

14voto

Martin Smith Points 174101

Je vois que vous avez ajouté une réponse à votre question dans SQL Server 2008 vous pouvez aussi faire

SELECT 3 + CRYPT_GEN_RANDOM(1) % 4 /*Random number between 3 and 6*/ 
FROM ...

Cette méthode présente quelques inconvénients

  1. C'est plus lent que le NEWID() méthode
  2. Bien qu'elle soit évaluée une fois par ligne, l'optimiseur de requêtes ne s'en rend pas compte. peut conduire à des résultats bizarres .

mais je pensais juste l'ajouter comme une autre option.

8voto

Lamak Points 33901

Vous pouvez le faire :

DECLARE @maxval TINYINT, @minval TINYINT
select @maxval=24,@minval=5

SELECT CAST(((@maxval + 1) - @minval) *
    RAND(CHECKSUM(NEWID())) + @minval AS TINYINT)

Et cela a été pris directement de ce lien Je ne sais pas vraiment comment donner du crédit à cette réponse.

7voto

Manjunath Bilwar Points 937

Voici la simple et unique ligne de code

Pour cela, utilisez le SQL Inbuild RAND() fonction.

Voici la formule pour générer un nombre aléatoire entre deux nombres (RETURN INT Range)

Ici, a est le premier chiffre (Min) et b est le deuxième chiffre (Max) de la plage.

SELECT FLOOR(RAND()*(b-a)+a)

Remarque : vous pouvez également utiliser la fonction CAST ou CONVERT pour obtenir un numéro de plage INT.

( CAST(RAND()*(25-10)+10 AS INT) )

Exemple :

SELECT FLOOR(RAND()*(25-10)+10);

Voici la formule pour générer un nombre aléatoire entre deux nombres (RETURN DECIMAL Range)

SELECT RAND()*(b-a)+a;

Exemple :

SELECT RAND()*(25-10)+10;

Pour plus de détails, vérifiez ceci : https://www.techonthenet.com/sql_server/functions/rand.php

5voto

Adrian Carr Points 535

Sympa et simple, du site de Pinal Dave :

http://blog.sqlauthority.com/2007/04/29/sql-server-random-number-generator-script-sql-query/

DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT
SET @Lower = 3 ---- The lowest random number
SET @Upper = 7 ---- One more than the highest random number
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random

(J'ai fait un léger changement à l'@Upper- pour inclure le nombre supérieur, j'ai ajouté 1).

0 votes

J'ai vu cet exemple dans un autre message. Il ne fournit pas de distribution aléatoire. Par exemple, la valeur inférieure est 1 et la valeur supérieure est 11. Je veux donc des nombres aléatoires de 1 à 10. Le 1 et le 10 ont la moitié des occurrences que le 2-8. Allez-y et testez-le.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X