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

KB2*_*B22 87 sql random postgresql

由于我在这个问题中处理的测试查询方法没有成功,我现在正在尝试别的东西.有没有办法告诉pg的random()功能只给我1到10之间的数字?

小智 140

如果数字介于1和10之间,则表示任何浮点数> = 1且<10,那么很容易:

select random() * 9 + 1
Run Code Online (Sandbox Code Playgroud)

这可以通过以下方式轻松测试:

# 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)
Run Code Online (Sandbox Code Playgroud)

如果你想要整数,> = 1和<10,那么它很简单:

select trunc(random() * 9 + 1)
Run Code Online (Sandbox Code Playgroud)

再次,简单的测试:

# 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)
Run Code Online (Sandbox Code Playgroud)

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

qd3*_*d3v 13

总结和简化,您可以使用:

-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);
Run Code Online (Sandbox Code Playgroud)

你可以像@ 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;
Run Code Online (Sandbox Code Playgroud)

  • [文档说](https://www.postgresql.org/docs/10/static/functions-math.html)“随机值在0.0 &lt;= x &lt;1.0范围内”,因此至少存在理论上的机会(ceil(random()* 10))的结果为0-我会坚持使用`floor`。 (2认同)

Neh*_*ain 8

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

SELECT Cast(RAND()*(b-a)+a as int);
Run Code Online (Sandbox Code Playgroud)

哪里

  • 'b'是上限
  • 'a'是下限