web-dev-qa-db-fra.com

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

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

Je sais, 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. 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 :

Question stupide, désolé ...

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

Cela génère un nombre aléatoire compris entre 0 et 9

ABS(CHECKSUM(NEWID()) % 10)

1 à 6

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

3 à 6

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

Mis à jour en fonction des commentaires: 

  • NEWID génère une chaîne aléatoire (pour chaque ligne en retour) 
  • CHECKSUM prend la valeur de string et crée un nombre
  • le module (%) est divisé par ce nombre et renvoie le reste (ce qui signifie que la valeur maximale correspond à un de moins que le nombre que vous utilisez). 
  • ABS change les résultats négatifs en positifs
  • puis ajoutez un au résultat pour éliminer 0 résultat (pour simuler un jet de dés)
146
orgtigger

Je vois que vous avez ajouté une réponse à votre question dans SQL Server 2008, vous pouvez également le faire.

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

Quelques inconvénients de cette méthode sont

  1. C'est plus lent que la méthode NEWID() 
  2. Même s’il est évalué une fois par ligne, l’optimiseur de requêtes ne réalise pas cela qui peut conduire à des résultats impairs .

mais juste pensé que je l'ajouterais comme une autre option.

11
Martin Smith

Tu peux 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 à partir de ce lien , je ne sais pas vraiment comment donner un crédit pour cette réponse.

7
Lamak

Sympa et simple, sur le 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 légèrement modifié le @ Supérieur pour inclure le nombre supérieur, ajouté 1.)

5
Adrian Carr

Voici la simple et unique ligne de code

Pour cela, utilisez la fonction SQL Inbuild Rand ().

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

Ici a est votre premier nombre (Min) et b est le deuxième nombre (Max) dans la plage

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

Remarque: Vous pouvez également utiliser la fonction CAST ou CONVERT pour obtenir le 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 (plage RETURN DECIMAL) 

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

Exemple:

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

Pour plus de détails, consultez: https://www.techonthenet.com/sql_server/functions/Rand.php

4
Manjunath Bilwar

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 changer et éditer ce code selon vos besoins.

3
MERT DOĞAN
SELECT ROUND((6 - 3 * Rand()), 0)
1
greg121

Lamak's réponse en 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
0
AndreFeijo

En général:

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

Pour ta question:

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

<=>

select Rand()*3+3;
0
Zeinab
DECLARE @min INT = 3;
DECLARE @max INT = 6;
SELECT @min + ROUND(Rand() * (@max - @min), 0);

Pas à pas

DECLARE @min INT = 3;
DECLARE @max INT = 6;

DECLARE @Rand DECIMAL(19,4) = Rand();
DECLARE @difference INT = @max - @min;
DECLARE @chunk INT = ROUND(@Rand * @difference, 0);
DECLARE @result INT = @min + @chunk; 
SELECT @result;

Notez qu'une fonction définie par l'utilisateur n'autorise donc pas l'utilisation de Rand (). Une solution de contournement pour cela (source: http://blog.sqlauthority.com/2012/11/20/sql-server-using-Rand-in-user-defined-functions-udf/ ) consiste à créer un voir en premier.

CREATE VIEW [dbo].[vw_RandomSeed]
AS
SELECT        Rand() AS seed

puis créer la fonction aléatoire

CREATE FUNCTION udf_RandomNumberBetween
(
    @min INT,
    @max INT
)
RETURNS INT
AS
BEGIN
    RETURN @min + ROUND((SELECT TOP 1 seed FROM vw_RandomSeed) * (@max - @min), 0);
END
0
Mike de Klerk