Generieren Sie eine Zufallszahl im Bereich von 1 bis 10


94

Da mein Ansatz für eine Testabfrage, an der ich in dieser Frage gearbeitet habe, nicht funktioniert hat, versuche ich jetzt etwas anderes. Gibt es eine Möglichkeit, der random()Funktion von pg mitzuteilen , dass ich nur Zahlen zwischen 1 und 10 bekomme?

Antworten:


152

Wenn Sie mit Zahlen zwischen 1 und 10 einen Float meinen, der> = 1 und <10 ist, dann ist es einfach:

select random() * 9 + 1

Dies kann leicht getestet werden mit:

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

Wenn Sie Ganzzahlen möchten, die> = 1 und <10 sind, ist dies ganz einfach:

select trunc(random() * 9 + 1)

Und wieder ein einfacher 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)

wähle Datum (e.created_at) + (abgeschnitten (zufällig () * 20)) aus Ereignissen e; Ergebnis in: FEHLER: Operator existiert nicht: Datum + doppelte Genauigkeit Gibt trunc wirklich ganze Zahlen zurück?
Bogdan Gusiev

3
trunc()Gibt den gleichen Datentyp wie die Eingabe zurück (wie im Handbuch angegeben). Sie müssen das Ergebnis in eine Ganzzahl trunc(random() * 20)::int
umwandeln

Ich frage mich, ob es zumindest theoretisch möglich ist, random()einen Wert <1 zurückzugeben, der bei Multiplikation mit 9 aufgrund der Ungenauigkeit des Typs mit doppelter Genauigkeit > = 9 wäre . Selbst wenn es in der Praxis möglich ist, wäre dies aufgrund der etwa 15-stelligen Genauigkeit natürlich unwahrscheinlich.

1
Ich spiele width_bucket(random(), 0, 1, 10)als Alternative mit

Es sieht so aus , als wären meine Befürchtungen unbegründet, obwohl ich gestehe, dass ich die Mathematik überhaupt nicht verstehe :-)

17

Um es zusammenzufassen und ein wenig zu vereinfachen, können Sie Folgendes verwenden:

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

Und Sie können dies wie von @ user80168 erwähnt testen

-- 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;

2
Die Dokumente sagen "Zufallswert im Bereich von 0,0 <= x <1,0", so dass zumindest eine theoretische Chance besteht, ceil(random() * 10)0 zu ergeben - ich würde mich daran halten floor.

1
Ich bin mit @JackDouglas einverstanden, also sollte es für den Bereich 1 - 10 seinSELECT floor(random() * 10 + 1);
SergiyKolesnikov

9

Wenn Sie SQL Server verwenden, ist der richtige Weg, um eine Ganzzahl zu erhalten,

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

Wo

  • 'b' ist die Obergrenze
  • 'a' ist die Untergrenze

Seien Sie hier vorsichtig, wenn Sie Ihre Untergrenze auf 1 und Ihre Obergrenze auf 10 setzen, erhalten Sie nur die Zahlen 1-> 9. Andere Antworten scheinen anzunehmen, dass zwischen 1 und 10 1-> 9 bedeutet ... Ich würde vorschlagen, wenn 'zwischen' die Obergrenze ausschließt, sollte auch die Untergrenze ausgeschlossen werden (dh 2-> 9). SELECT Cast (RAND () * ((b + 1) -a) + a als int);
Morvael

Die Frage ist eindeutig als PostgreSQL-Frage gekennzeichnet.
Sebastian Palma

4

(abgeschnitten (zufällig () * 10)% 10) + 1


FEHLER: Operator existiert nicht: doppelte Genauigkeit% Ganzzahl

1
Und warum sollten Sie überhaupt Modul verwenden? Diese Logik macht keinen Sinn. Wenn Sie eine "Umhüllung" erhalten, haben Sie keine gleichmäßige Verteilung, und wenn Sie keine erhalten, brauchen Sie diese nicht.
ErikE

1

Die richtige Version von Hythlodayrs Antwort.

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

Die Ausgabe von truncmuss in konvertiert werden INTEGER. Aber es kann ohne gemacht werden trunc. Es stellt sich also als einfach heraus.

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

Erzeugt einen INTEGER-Ausgang im Bereich [1, 10], dh sowohl 1 als auch 10.

Informationen zu beliebigen Zahlen (Floats) finden Sie in der Antwort von user80168. dh konvertiere es einfach nicht in INTEGER.


0

Eigentlich weiß ich nicht, dass du das willst.

Versuche dies

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

0

Diese gespeicherte Prozedur fügt eine Rand-Nummer in eine Tabelle ein. Pass auf, es fügt endlose Zahlen ein. Stoppen Sie die Ausführung, wenn Sie genügend Zahlen erhalten.

Erstellen Sie eine Tabelle für den Cursor:

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

GEHEN

Erstellen Sie eine Tabelle mit Ihren Zahlen:

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

EINFÜGEN DES SCRIPT:

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

ERSTELLEN UND AUSFÜHREN DES VERFAHRENS:

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

Füllen Sie Ihren Tisch:

EXEC RandNumbers

3
Die Frage
bezieht sich auf
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.