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


95

由于我针对该问题进行的测试查询方法无法解决,因此我现在正在尝试其他方法。有没有办法告诉pg的random()函数让我只得到1到10之间的数字?

Answers:


152

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

从事件e中选择日期(e.created_at)+(trunc(random()* 20)); 结果:错误:运算符不存在:日期+双精度截断真的返回整数吗?
Bogdan Gusiev

3
trunc()返回与输入相同的数据类型(如手册中所述)。您需要将结果转换为整数:trunc(random() * 20)::int
a_horse_with_no_name 2011年

我想知道至少在理论上是否可能random()由于双精度类型不精确性质而返回小于1的值,而该值乘以9会大于等于9 吗?实际上,即使有可能,由于15位数左右的精度,它也几乎不会消失。

1
我正在width_bucket(random(), 0, 1, 10)作为一种替代选择

尽管我承认我根本不理解数学,但看起来我的担心是没有根据的:-)

17

总结和简化,可以使用:

-- 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 - I将坚持floor

1
我同意@JackDouglas,因此对于范围1-10应该是SELECT floor(random() * 10 + 1);
SergiyKolesnikov

9

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

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

哪里

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

请注意,如果将下限设为1,将上限设为10,则只会得到数字1-> 9。其他答案似乎假设1到10之间表示1-> 9 ...我建议如果'between'排除上限,则还应该排除下限(即2-> 9)。SELECT Cast(RAND()*((b + 1)-a)+ a为int);
Morvael

该问题被明确标记为PostgreSQL问题。
塞巴斯蒂安·帕尔马

4

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


错误:运算符不存在:双精度%整数

1
而且为什么仍要使用模数?这种逻辑没有道理。如果得到任何“包装”,您将不会得到均等的分配;如果没有得到任何“包装”,则不需要它。
ErikE 2012年

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)的INTEGER输出。

有关任何数字(浮点数),请参见user80168的答案。即不要将其转换为INTEGER


0

其实我不知道你想要这个。

试试这个

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

0

此存储过程将rand号插入到表中。往外看,它会插入一个无尽的数字。当您获得足够的数字时,停止执行它。

为光标创建一个表:

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
a_horse_with_no_name
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.