2009-09-09 19 views

Respuesta

127

Si por números entre 1 y 10 que quiere decir cualquier flotador que es> = 1 y < 10, entonces es fácil:

select random() * 9 + 1 

Esto se puede comprobar 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 enteros, que son> = 1 y < 10, entonces es simple:

select trunc(random() * 9 + 1) 

Y de nuevo, simple prueba:

# 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) 
+0

seleccione date (e.created_at) + (trunc (random() * 20)) de los eventos e; resultado de: ERROR: el operador no existe: date + double precision ¿Trunc realmente devuelve números enteros? –

+3

'trunc()' devuelve el mismo tipo de datos que la entrada (como se indica en el manual). Necesita convertir el resultado en un entero: 'trunc (random() * 20) :: int' –

+0

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] (http://www.postgresql.org/docs/9.1/static/datatype-numeric.html#DATATYPE-FLOAT)? En la práctica, incluso si es posible, sería extremadamente improbable, por supuesto, debido a la precisión de 15 dígitos. –

3

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

+0

ERROR: operator does not exist: double precision% integer –

+1

¿Y por qué usaría el módulo de todos modos? Esta lógica no tiene sentido. Si obtienes un "envoltorio", no tendrás la misma distribución, y si no obtienes ninguno, entonces no lo necesitas. – ErikE

0

En realidad no sé desea esto.

probar esto

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

Para resumir y un poco simplificar, se puede utilizar:

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

Y se puede probar esto, como se ha mencionado por @ 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; 
+0

El [docs say] (https://www.postgresql.org/docs/10/static/functions-math.html) "valor aleatorio en el rango de 0.0 <= x <1.0", por lo que hay al menos un teórico posibilidad de 'ceil (random() * 10)' resultando en 0 - Me quedaría en 'floor'. –

6

Si están utilizando SQL Server, a continuación, la forma correcta para obtener entero es

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

Dónde

  • 'b' es el límite superior
  • 'a' es límite inferior
+0

Tenga cuidado aquí, si coloca su límite inferior como 1 y superior como 10, solo obtendrá los números 1-> 9. Otras respuestas parecen suponer que entre 1 y 10 significa 1> 9 ... Sugeriría que si 'entre' excluye el límite superior también debería excluir el más bajo (es decir, 2> 9). SELECCIONE Cast (RAND() * ((b + 1) -a) + a como int); – Morvael

0

Este procedimiento almacenado inserta un número rand en una tabla. Cuidado, inserta un número interminable. Deje de ejecutarlo cuando obtenga suficientes números.

crear una tabla para el cursor:

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

GO

Crear una tabla para contener sus números:

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

INSERCIÓN DE LA ESCRITURA:

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

CREACIÓN Y E XECUTING EL 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 

llenar su tabla:

EXEC RandNumbers 
+1

La pregunta es sobre Postgres, no SQL Server –

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 trunc tiene que ser convertido a INTEGER. Pero se puede hacer sin trunc. Entonces resulta ser simple.

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

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

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

Cuestiones relacionadas