代码之家  ›  专栏  ›  技术社区  ›  KB22

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

  •  83
  • KB22  · 技术社区  · 15 年前

    因为我的测试查询方法 this question 没有解决,我正在尝试其他的方法。有办法告诉PG吗 random() 函数只获取1到10之间的数字?

    7 回复  |  直到 7 年前
        1
  •  134
  •   Klesun Gian Marco    7 年前

    如果用介于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)
    
        2
  •  12
  •   vanburg    9 年前

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

    -- 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;
    
        3
  •  9
  •   Avinash Jain    8 年前

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

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

    在哪里?

    • “B”是上限
    • “A”是下限
        4
  •  3
  •   hythlodayr    15 年前

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

        5
  •  1
  •   mythicalcoder    7 年前

    hythlodayer答案的正确版本。

    -- ERROR:  operator does not exist: double precision % integer
    -- LINE 1: select (trunc(random() * 10) % 10) + 1
    

    输出来自 trunc 必须转换为 INTEGER . 但如果没有 躯干 .结果很简单。

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

    生成范围为[1,10]的整数输出,即1和10都包括在内。

    对于任何数字(浮点数),请参见用户80168的答案。也就是说,不要把它转换成 整数 .

        6
  •  0
  •   leejaycoke    11 年前

    实际上我不知道你想这样。

    试试这个

    INSERT INTO my_table (my_column)
    SELECT
        (random() * 10) + 1
    ;
    
        7
  •  0
  •   Deepak Mahakale    8 年前

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

    为光标创建表:

    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