Generate a random number in the range 1 - 10

由于我在 这个问题中使用的测试查询方法没有成功,我现在正在尝试其他方法。有没有办法告诉 pg 的 random()函数只能得到1到10之间的数字?

177197 次浏览

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

如果使用 SQLServer,那么获取整数的正确方法是

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)

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

创建和执行程序:

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]内的 INTEGER 输出,即包括1和10。

对于任何数字(float) ,请参阅 user80168的答案。即不要将其转换为 INTEGER

试试这个:

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

例子

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