Sql 生成1-10范围内的随机数

Sql 生成1-10范围内的随机数,sql,postgresql,random,Sql,Postgresql,Random,由于我在中使用的测试查询方法不起作用,我现在正在尝试其他方法。有没有办法告诉pg的random()函数只获取1到10之间的数字?(trunc(random()*10)%10)+1如果1到10之间的数字指的是>=1和

由于我在中使用的测试查询方法不起作用,我现在正在尝试其他方法。有没有办法告诉pg的
random()
函数只获取1到10之间的数字?

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

如果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)

事实上我不知道你想要这个

试试这个

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

要进行总结并稍微简化,您可以使用:

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

若您使用的是SQL Server,那个么获取整数的正确方法是

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

  • “b”是上限
  • “a”是下限

此存储过程将随机数插入表中。注意,它插入了无数的数字。当你得到足够的数字时,停止执行它

为光标创建一个表:

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

创建一个包含数字的表:

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
创建和执行过程:

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

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(含1和10)


有关任何数字(浮动),请参阅user80168的答案。i、 只是不要把它转换成整数,从事件e中选择日期(e.created_at)+(trunc(random()*20));结果:错误:运算符不存在:日期+双精度trunc真的返回整数吗?
trunc()
返回与输入相同的数据类型(如手册中所述)。您需要将结果强制转换为整数:
trunc(random()*20)::int
我想知道,至少在理论上,
random()
是否有可能由于以下原因返回值=9?实际上,即使有可能,由于15位左右的精度,它也不太可能出现。我正在玩弄
width\u bucket(random(),0,1,10)
另一种选择是,尽管我承认我根本不懂数学:-)错误:运算符不存在:双精度%整数,为什么还要使用模数?这种逻辑没有道理。如果你得到任何“包装”,你将不会有相等的分布,如果你没有得到任何,那么你就不需要它。这里要小心,如果你把下限设为1,上限设为10,你只会得到数字1->9。其他答案似乎认为1到10意味着1->9。。。我建议如果'between'排除上限,那么它也应该排除下限(即2->9)。选择Cast(RAND()*((b+1)-a)+a作为int);这个问题显然被标记为PostgreSQL问题。这个问题是关于Postgres,而不是SQL Server的“0.0范围内的随机值我同意@JackDouglas,因此对于1-10范围,它应该是
SELECT floor(random()*10+1);