web-dev-qa-db-fra.com

Générer un nombre aléatoire compris entre 1 et 10

Puisque mon approche pour une requête test sur laquelle j'ai travaillé dans cette question n'a pas fonctionné, j'essaie autre chose maintenant. Existe-t-il un moyen de dire à la fonction random() de pg de ne me donner que des nombres compris entre 1 et 10?

83
KB22

Si vous entendez par un nombre compris entre 1 et 10 un nombre> = 1 et <10, alors c'est facile:

select random() * 9 + 1

Ceci peut être facilement testé avec:

# select min(i), max(i) from (
    select random() * 9 + 1 as i from generate_series(1,1000000)
) q;
       min       |       max
-----------------+------------------
 1.0000083274208 | 9.99999571684748
(1 row)

Si vous voulez des entiers, qui sont> = 1 et <10, c'est simple:

select trunc(random() * 9 + 1)

Et encore, test simple:

# select min(i), max(i) from (
    select trunc(random() * 9 + 1) as i from generate_series(1,1000000)
) q;
 min | max
-----+-----
   1 |   9
(1 row)
134
user80168

Pour résumer et un peu simplifier, vous pouvez utiliser:

-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);

Et vous pouvez tester cela comme mentionné par @ user80168

-- 0 - 9
SELECT min(i), max(i) FROM (SELECT floor(random() * 10) AS i FROM generate_series(0, 100000)) q;
-- 0 - 10
SELECT min(i), max(i) FROM (SELECT floor(random() * (10 + 1)) AS i FROM generate_series(0, 100000)) q;
-- 1 - 10
SELECT min(i), max(i) FROM (SELECT ceil(random() * 10) AS i FROM generate_series(0, 100000)) q;
12
vanburg

Si vous utilisez SQL Server, le moyen correct d'obtenir un entier est 

SELECT Cast(Rand()*(b-a)+a as int);

Où 

  • «b» est la limite supérieure
  • 'a' est la limite inférieure
9
Neha Jain

(tronc (aléatoire () * 10)% 10) + 1

3
hythlodayr

La version correcte de la réponse de hythlodayr.

-- ERROR:  operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1

La sortie de trunc doit être convertie en INTEGER. Mais cela peut être fait sans trunc. Donc, cela s'avère simple.

select (random() * 9)::INTEGER + 1

Génère une sortie INTEGER dans la plage [1, 10], à savoir les valeurs 1 et 10 incluses.

Pour un nombre quelconque (floats), voir la réponse de user80168. c'est-à-dire, ne le convertissez pas en INTEGER.

1
mythicalcoder

En fait, je ne sais pas si vous voulez ça.

essaye ça

INSERT INTO my_table (my_column)
SELECT
    (random() * 10) + 1
;
0
leejaycoke

Cette procédure stockée insère un nombre Rand dans une table. Attention, cela insère un nombre infini. Arrêtez de l'exécuter quand vous aurez assez de chiffres.

créer une table pour le curseur:

CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL) 

ALLER

Créez un tableau pour contenir vos numéros:

CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)

INSERTION DU SCRIPT:

INSERT INTO [SearchIndex]([Cursor])  SELECT N'INSERT INTO ID  SELECT   FLOOR(Rand() * 9 + 1)  SELECT COUNT (ID) FROM ID

CRÉATION ET EXÉCUTION DE LA PROCÉDURE:

CREATE PROCEDURE [dbo].[RandNumbers] AS
BEGIN
Declare  CURSE  CURSOR  FOR (SELECT  [Cursor] FROM [dbo].[SearchIndex]  WHERE [Cursor] IS NOT NULL)
DECLARE @RandNoSscript NVARCHAR (250)
OPEN CURSE
FETCH NEXT FROM CURSE
INTO @RandNoSscript 
WHILE @@FETCH_STATUS IS NOT NULL 
BEGIN
Print @RandNoSscript
EXEC SP_EXECUTESQL @RandNoSscript;  
 END
 END
GO

Remplissez votre tableau:

EXEC RandNumbers
0
Abu Khalil Mohamed