2009-09-09 13 views

risposta

127

Se da numeri compresi tra 1 e 10 si intende qualsiasi galleggiante che è> = 1 e < 10, allora è facile:

select random() * 9 + 1 

Questo può essere facilmente testato 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) 

Se volete numeri interi, che sono> = 1 e < 10, allora è semplice:

select trunc(random() * 9 + 1) 

E ancora, semplice test:

# 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

selezionare la data (e.created_at) + (trunc (random() * 20)) dagli eventi e; risultato: ERRORE: operatore non esiste: Data + doppia precisione Does trunc tornare davvero interi? –

+3

'trunc()' restituisce lo stesso tipo di dati dell'input (come indicato nel manuale). È necessario trasmettere il risultato a un intero: 'trunc (random() * 20) :: int' –

+0

Mi chiedo se, almeno in teoria, sia possibile che' random() 'restituisca un valore <1 che moltiplicato per 9 sarebbe> = 9 a causa della [natura inesatta del tipo a doppia precisione] (http://www.postgresql.org/docs/9.1/static/datatype-numeric.html#DATATYPE-FLOAT)? In pratica, anche se fosse possibile sarebbe ovviamente improbabile, a causa delle 15 cifre o della precisione. –

3

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

+0

ERRORE: operatore non esiste: doppia precisione% intero –

+1

E perché si dovrebbe utilizzare il modulo in ogni caso? Questa logica non ha senso. Se ottieni un "involucro" non avrai la stessa distribuzione, e se non ne ottieni, non ne hai bisogno. – ErikE

0

In realtà non so che si desidera questo.

provare questo

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

Per riassumere e un po 'semplificare, si può usare:

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

E si può verificare questo, come citato da @ 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

I documenti [dicono] (https://www.postgresql.org/docs/10/static/functions-math.html) "valore casuale nell'intervallo 0.0 <= x <1.0", per cui v'è almeno un teorico possibilità di 'ceil (random() * 10)' risultante in 0 - Mi attaccherei a 'floor'. –

6

Se stanno usando SQL Server, quindi il modo corretto per ottenere l'intero è

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

Dove

  • 'b' è il limite superiore
  • 'a' è limite inferiore
+0

Fai attenzione qui, se metti il ​​limite inferiore come 1 e quello superiore come 10, otterrai solo numeri 1-> 9. Altre risposte sembrano assumere che tra 1 e 10 significa 1-> 9 ... Suggerirei se 'tra' esclude il limite superiore, dovrebbe anche escludere il più basso (cioè 2-> 9). SELECT Cast (RAND() * ((b + 1) -a) + a as int); – Morvael

0

Questa stored procedure inserisce un numero rand in una tabella. Attenzione, inserisce un numero infinito. Smetti di eseguirlo quando ottieni abbastanza numeri.

creare una tabella per il cursore:

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

GO

Creare una tabella per contenere i numeri:

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

INSERIMENTO DELLA SCENEGGIATURA:

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

CREAZIONE E E XECUTING LA PROCEDURA:

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 

Riempire la vostra tavola:

EXEC RandNumbers 
+1

La domanda riguarda Postgres, non SQL Server –

1

La versione corretta della risposta di hythlodayr.

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

L'uscita dal trunc deve essere convertito in INTEGER. Ma può essere fatto senza trunc. Quindi risulta essere semplice.

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

Genera un'uscita numero intero nell'intervallo [1, 10] cioè sia 1 & 10 compreso.

per qualsiasi numero (carri), si veda la risposta di user80168. non lo converto in INTEGER.

Problemi correlati