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.

5voto

MERT DOĞAN Points 201

Tout simplement :

DECLARE @MIN INT=3; --We define minimum value, it can be generated.
DECLARE @MAX INT=6; --We define maximum value, it can be generated.

SELECT @MIN+FLOOR((@MAX-@MIN+1)*RAND(CONVERT(VARBINARY,NEWID()))); --And then this T-SQL snippet generates an integer between minimum and maximum integer values.

Vous pouvez modifier et éditer ce code selon vos besoins.

1 votes

Bien que cet extrait de code soit le bienvenu, et qu'il puisse apporter une certaine aide, il serait serait grandement amélioré s'il comprenait une explication de comment il répond à la question. Sans cela, votre réponse a beaucoup moins de valeur éducative - n'oubliez pas que vous répondez à la question pour les lecteurs à venir, et pas seulement pour la personne qui pose la question maintenant ! Veuillez consulter le site modifier votre réponse pour ajouter des explications et indiquer les limites et les hypothèses applicables.

2voto

Zeinab Points 137

En général :

select rand()*(@upper-@lower)+@lower;

Pour votre question :

select rand()*(6-3)+3;

<=>

select rand()*3+3;

1voto

greg121 Points 162
SELECT ROUND((6 - 3 * RAND()), 0)

0voto

AndreFeijo Points 558

Lamak's réponse sous forme de fonction :

-- Create RANDBETWEEN function
-- Usage: SELECT dbo.RANDBETWEEN(0,9,RAND(CHECKSUM(NEWID())))
CREATE FUNCTION dbo.RANDBETWEEN(@minval TINYINT, @maxval TINYINT, @random NUMERIC(18,10))
RETURNS TINYINT
AS
BEGIN
  RETURN (SELECT CAST(((@maxval + 1) - @minval) * @random + @minval AS TINYINT))
END
GO

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