Como mi enfoque para una consulta de prueba en la que trabajé en this question no funcionó, estoy intentando algo más ahora. ¿Hay alguna manera de decir la función de random()
de la pg para obtener solo números entre 1 y 10?Genere un número aleatorio en el rango 1 - 10
Respuesta
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)
(trunc (random() * 10)% 10) + 1
ERROR: operator does not exist: double precision% integer –
¿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
En realidad no sé desea esto.
probar esto
INSERT INTO my_table (my_column)
SELECT
(random() * 10) + 1
;
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;
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'. –
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
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
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
La pregunta es sobre Postgres, no SQL Server –
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
.
- 1. Generando un número aleatorio excluyendo el rango
- 2. ¿Generar un número aleatorio dentro del rango?
- 3. número aleatorio entre -10 y 10 en JavaScript
- 4. Número aleatorio en el rango [min - max] usando PHP
- 5. Número aleatorio: 0 o 1
- 6. Produce un número aleatorio en un rango usando C#
- 7. ¿Generar un número aleatorio dentro del rango en iOS?
- 8. generar un número aleatorio con 7 dígitos
- 9. ¿Cómo obtener un número aleatorio entre un rango de flotación?
- 10. genera un número aleatorio entre 1 yx donde es más probable un número menor que uno más alto
- 11. Generación de un doble número aleatorio de un cierto rango en Java
- 12. ¿Cómo obtener un número aleatorio en pascal?
- 13. ¿Cómo generar un número aleatorio en Bash?
- 14. Genere un número aleatorio con una longitud de longitud aleatoria en Objective-C
- 15. cambiar probabilidad de obtener un número aleatorio
- 16. Generar un entero aleatorio en un rango en Haskell
- 17. Número aleatorio en iphone sdk?
- 18. Número aleatorio en un bucle
- 19. jQuery Número aleatorio no funciona
- 20. ¿Cómo hago que mi aplicación para Android genere un número aleatorio?
- 21. Obtener entero aleatorio en el rango de (x, y]
- 22. Número aleatorio no repetitivo
- 23. ¿Cómo obtener un número aleatorio en JSTL?
- 24. Número aleatorio dentro de un rango basado en una distribución normal
- 25. ¿Cómo puedo generar un número aleatorio dentro de un rango pero excluir algunos?
- 26. generar un número aleatorio corto en java?
- 27. Aleatorio.Siguiente no está dando un número aleatorio
- 28. Algoritmo para generar un número aleatorio
- 29. Rango de número de RegExp (1 a 36)
- 30. usando rand para generar un número aleatorio
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? –
'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' –
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. –