Genere un número aleatorio en el rango 1 - 10

95

Dado que mi enfoque para una consulta de prueba en la que trabajé en esta pregunta no funcionó, estoy intentando otra cosa ahora. ¿Hay alguna manera de decirle a la random()función de pg que me obtenga solo números entre 1 y 10?

KB22
fuente

Respuestas:

152

Si por números entre 1 y 10 te refieres a cualquier flotante que sea> = 1 y <10, entonces es fácil:

select random() * 9 + 1

Esto se puede probar fácilmente con:

# 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 desea números enteros, que son> = 1 y <10, entonces es simple:

select trunc(random() * 9 + 1)

Y de nuevo, prueba 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)
Klesun
fuente
seleccione la fecha (e.created_at) + (trunc (random () * 20)) de los eventos e; resultado en: ERROR: el operador no existe: fecha + precisión doble ¿Trunc realmente devuelve enteros?
Bogdan Gusiev
3
trunc()devuelve el mismo tipo de datos que la entrada (como se indica en el manual). trunc(random() * 20)::int
Debe
Me pregunto si al menos en teoría es posible que random()devuelva un valor <1 que cuando se multiplica por 9 sería> = 9 debido a la naturaleza inexacta del tipo de precisión doble . En la práctica, incluso si es posible, sería muy improbable, por supuesto, debido a la precisión de 15 dígitos aproximadamente.
1
Estoy jugando width_bucket(random(), 0, 1, 10)como una alternativa
Parece que mis temores eran infundados, aunque confieso que no entiendo las matemáticas en absoluto :-)
17

Para resumir y simplificar un poco, puede usar:

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

Y puedes probar esto como lo menciona @ 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;
qd3v
fuente
2
Los documentos dicen "valor aleatorio en el rango 0.0 <= x <1.0", por lo que hay al menos una posibilidad teórica de dar como ceil(random() * 10)resultado 0, me apegaría floor.
1
Estoy de acuerdo con @JackDouglas, así que para el rango 1 - 10 debería serSELECT floor(random() * 10 + 1);
SergiyKolesnikov
9

Si está utilizando SQL Server, la forma correcta de obtener un entero es

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

Dónde

  • 'b' es el límite superior
  • 'a' es el límite inferior
Neha Jain
fuente
Tenga cuidado aquí, si coloca su límite inferior como 1 y el superior como 10, solo obtendrá los números 1-> 9. Otras respuestas parecen asumir que Entre 1 y 10 significa 1-> 9 ... Sugeriría que si 'entre' excluye el límite superior, también debería excluir el inferior (es decir, 2-> 9). SELECT Cast (RAND () * ((b + 1) -a) + a como int);
Morvael
La pregunta está claramente etiquetada como una pregunta de PostgreSQL.
Sebastian Palma
4

(trunc (aleatorio () * 10)% 10) + 1

hythlodayr
fuente
ERROR: el operador no existe: doble precisión% entero
1
¿Y por qué usarías módulo de todos modos? Esta lógica no tiene sentido. Si obtiene algún "ajuste", no tendrá una distribución equitativa, y si no obtiene ninguno, entonces no lo necesita.
ErikE
1

La versión correcta de la respuesta de hythlodayr.

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

La salida de truncdebe convertirse a INTEGER. Pero se puede hacer sin él trunc. Entonces resulta simple.

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

Genera una salida INTEGER en el rango [1, 10], es decir, tanto 1 como 10 inclusive.

Para cualquier número (flotantes), consulte la respuesta de user80168. es decir, simplemente no lo convierta a INTEGER.

codificador mítico
fuente
0

En realidad, no sé que quieras esto.

prueba esto

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

Este procedimiento almacenado inserta un número rand en una tabla. Cuidado, inserta un número infinito. Deja de ejecutarlo cuando tengas suficientes números.

crea una tabla para el cursor:

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

VAMOS

Crea una tabla que contenga tus números:

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

INSERTAR EL GUIÓN:

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

CREACIÓN Y EJECUCIÓN DEL PROCEDIMIENTO:

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

Llena tu mesa:

EXEC RandNumbers
Abu Khalil Mohamed
fuente
3
La pregunta es sobre Postgres, no sobre SQL Server
a_horse_with_no_name