2009-09-09 190 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

相关问题