在1-10范围内生成一个随机数。

128

由于我在这个问题中处理测试查询的方法不起作用,现在我正在尝试其他方法。是否有一种方法可以告诉pg的random()函数只获取1到10之间的数字?

10个回答

194
如果你所说的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)

1
从事件e中选择日期(e.created_at),并加上(trunc(random() * 20))。 结果为: 错误:不存在日期+双精度运算符。 trunc函数是否真的返回整数? - Bogdan Gusiev
5
trunc() 函数返回与输入相同的数据类型(如手册所述)。 您需要将结果转换为整数:trunc(random() * 20)::int - user330315
我想知道在理论上是否可能,由于双精度类型的不精确性,random()返回一个小于1的值,当乘以9时大于或等于9?实际上,即使可能性存在,由于约15位数字的精度,这种情况也是微乎其微的。 - user533832
1
我正在考虑使用width_bucket(random(), 0, 1, 10)作为替代方案。 - user533832
看起来我的担忧是没有根据的,尽管我承认我完全不理解这个数学 :-) - user533832
这不是 SQL 的正确写法,在 SQL 2014 中我遇到了错误:'random' 不是一个被识别的内置函数名。 - Avinash Jain

22

总的来说,简化一点,您可以使用:

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

2
文档中说:“在范围0.0 <= x < 1.0内生成随机值”,因此理论上ceil(random() * 10)可能会得到0,建议使用floor - user6854914
1
我同意@JackDouglas的观点,因此对于1-10范围内的情况,应该是SELECT floor(random() * 10 + 1); - SergiyKolesnikov

13

如果您正在使用 SQL Server,则获取整数的正确方法是

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

当:

  • 'b' 为上限
  • 'a' 为下限

在这里要小心,如果您将下限设为1,上限设为10,则只会得到1->9的数字。其他回答似乎假定1到10之间的数字表示为1->9 ... 我建议如果“之间”的表示方式排除了上限,则应该也排除下限(即2->9)。选择Cast(RAND()*((b+1)-a)+a as int)。 - Morvael
1
这个问题明确标记为PostgreSQL问题。 - Sebastián Palma

4

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


错误:运算符不存在:double precision % integer - user533832
1
为什么你会使用取模运算呢?这个逻辑毫无意义。如果出现任何“包装”,你将无法实现均等分布;而如果没有任何“包装”,那就根本不需要使用它。 - ErikE

3
使用Postgres,以下是如何生成在任意2个数字之间的随机数,比如minmax:
包括min但不包括max
SELECT floor(random() * (max - min)) + min;

包括 minmax

SELECT floor(random() * (max - min + 1)) + min;

要获取1到10之间(包括10)的数字,

最小值=1,最大值=10

SELECT floor(random() * (10 - 1 + 1)) + 1;

通常情况下,您可以使用此公式来获取在任何最小值和最大值之间的随机整数。

2

hythlodayr的回答正确版本

-- ERROR:  operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1
< p > trunc 的输出必须转换为INTEGER类型。但是可以在不使用trunc的情况下完成。因此,这变得很简单。

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

生成一个1到10的整数,包括1和10。

如果是任何数字(浮点数),请参考用户80168的答案。即不要将其转换为INTEGER


1

例子

SELECT RAND()*(min-max)+max

0

试试这个:

Select (ROW_NUMBER() OVER (ORDER BY ItemDesc ASC)+15000) as ID, ItemCode, ItemDesc

0

实际上我不知道你想要什么。

试试这个

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

0

这个存储过程将一个随机数插入到表中。注意,它会不断地插入数字。当你得到足够的数字时,请停止执行它。

为游标创建一个表:

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

3
问题是关于Postgres,而不是SQL Server。 - user330315

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接