it-swarm.com.de

Generieren Sie eine Zufallszahl im Bereich von 1 bis 10

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

83
KB22

Wenn Sie mit Zahlen zwischen 1 und 10 einen Float von> = 1 und <10 meinen, 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 wünschen, die> = 1 und <10 sind, ist es einfach:

select trunc(random() * 9 + 1)

Und nochmal 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)
134
user80168

Zusammenfassend und ein wenig vereinfachend 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;
12
vanburg

Wenn Sie SQL Server verwenden, ist der korrekte Weg, Integer zu erhalten, korrekt 

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

Woher 

  • 'b' ist die Obergrenze
  • 'a' ist die Untergrenze
9
Neha Jain

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

3
hythlodayr

Die richtige Version der Antwort von hythlodayr.

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

Die Ausgabe von trunc muss in INTEGER konvertiert werden. Es ist aber auch ohne trunc möglich. Es stellt sich also als einfach heraus.

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

Erzeugt eine INTEGER-Ausgabe im Bereich [1, 10], d. H. Sowohl 1 als auch 10.

Für eine beliebige Anzahl (Floats) siehe die Antwort von user80168. konvertieren Sie es einfach nicht in INTEGER.

1
mythicalcoder

Eigentlich weiß ich nicht, dass du das willst.

versuche dies

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

Diese gespeicherte Prozedur fügt eine Rand-Nummer in eine Tabelle ein. Achtung, es fügt eine unendliche Zahl ein. Beenden Sie die Ausführung, wenn Sie genügend Zahlen erhalten haben.

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 Nummern:

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

EINSETZEN 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
0