2009-09-09 184 views

回答

127

如果在1和10之間的數字你指任何浮點數即> = 1和< 10,則很容易:

select random() * 9 + 1 

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

如果你想整數,是> = 1和< 10,那麼它很簡單:

這可以很容易地測試

select trunc(random() * 9 + 1) 

再次,簡單的測試:

# 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

從事件e中選擇日期(e.created_at)+(trunc(random()* 20)); 結果在: 錯誤:運算符不存在:日期+雙精度 trunc是否真的返回整數? – 2010-01-26 12:44:28

+3

'trunc()'返回與輸入相同的數據類型(如手冊中所述)。你需要將結果轉換爲一個整數:'trunc(random()* 20):: int' – 2011-10-05 17:35:47

+0

我想知道至少在理論上有可能'random()'返回一個小於1的值,乘以由於[雙精度類型的不精確性質],9會大於9(http://www.postgresql.org/docs/9.1/static/datatype-numeric.html#DATATYPE-FLOAT)?在實踐中,即使有可能,當然也不會因爲15位或更精確的數字而消失。 – 2012-08-14 14:54:26

3

(TRUNC(隨機()* 10)%10)+ 1

+0

錯誤:運算符不存在:雙精度%整數 – 2012-08-14 15:02:42

+1

爲什麼你會使用模數呢?這個邏輯沒有意義。如果你得到任何「包裝」,你將不會有平等的分配,如果你沒有得到任何,那麼你不需要它。 – ErikE 2012-08-14 22:47:48

0

其實我不知道你想這一點。

試試這個

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

總結,有點簡化,你可以使用:

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

你可以測試這個喜歡用@提到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

[文檔說](https://www.postgresql.org/docs/10/static/functions-math.html)「0.0 <= x <1.0」範圍內的隨機值,所以至少有一個理論'ceil(random()* 10)'產生0的機會 - 我會堅持'floor'。 – 2018-01-15 08:48:57

6

如果您正在使用SQL Server,那麼正確的方式來獲取整數是

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

  • 'b' 爲上限
  • 'a' 爲下限
+0

這裏要小心,如果你把你的下限設爲1,上限設爲10,你只會得到數字1-> 9。其他答案似乎認爲,1到10之間意味着1-> 9 ...我認爲如果'之間'排除上限,它也應該排除下限(即2-> 9)。 SELECT Cast(RAND()*((b + 1)-a)+ a as int); – Morvael 2016-12-08 09:09:18

0

此存儲的過程中插入一個蘭特數插入表中。看,它插入一個無窮無盡的數字。當你得到足夠的數字時停止執行它。

創建一個表指針:

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

GO

創建一個表來包含你的號碼:

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

插入腳本:

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

創建和E XECUTING程序:

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 

填寫表格:

EXEC RandNumbers 
+1

問題是關於Postgres,而不是SQL Server – 2017-01-27 08:59:29

1

hythlodayr的答案的正確版本。

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

輸出從trunc必須被轉換到INTEGER。但它可以在沒有trunc的情況下完成。所以結果很簡單。

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

生成在範圍[1,10]即兩個1 & 10的整數輸出。

對於任何數字(浮點數),請參閱user80168的答案。即只是不要將其轉換爲INTEGER

相關問題