使用MYSQL创建一个随机数


95

我想知道是否有一种方法可以选择随机生成的100和500之间的数字以及选择查询。

例如: SELECT name, address, random_number FROM users

我不必将此数字存储在db中,仅用于显示目的。

我尝试过类似的方法,但是无法正常工作。

SELECT name, address, FLOOR(RAND() * 500) AS random_number FROM users

希望有人帮助我。谢谢


Answers:


145

这应该给出您想要的:

FLOOR(RAND() * 401) + 100

通常,FLOOR(RAND() * (<max> - <min> + 1)) + <min>生成一个介于<min>和<max>包含之间的数字。

更新资料

完整的声明应该起作用:

SELECT name, address, FLOOR(RAND() * 401) + 100 AS `random_number` 
FROM users

我如何使用此代码。我这样尝试-FLOOR(RAND()* 401)+ 100作为数字,但没有起作用
TNK

注意:我的数据库中没有名为“ number”的列。这必须是动态生成的列。有可能吗?
TNK

1
@EdHeal实际上我认为round()会给出不均匀的分布。
2013年

1
最好将结果存储到变量中,如果您具有主从复制,则可以使用该变量。SET @r=FLOOR(RAND() * 401) + 100然后SELECT @r
钱陈

3
RAND()UUID()NOW()是不确定的功能。应避免将此类函数的调用写入bin日志中以进行复制。例如。INSERT INTO t SET ID=UUID();将导致ID主服务器和从服务器上的字段值不同。相反,它需要先编写为SET @uuid:=UUID();,然后再编写INSERT INTO t SET ID=@uuid;,然后在单个事务中运行它们。这将是复制安全的。对于这个问题,这个话题有点离题。它并不表示您的答案有任何问题。:)
钱琛

10

由于RAND产生的数字0 <= v <1.0(请参阅文档),因此需要使用ROUND以确保可以得到上限(在这种情况下为500)和下限(在这种情况下为100)

因此,要产生范围,您需要:

SELECT name, address, ROUND(100.0 + 400.0 * RAND()) AS random_number
FROM users

这种编码是这样工作的-SELECT ROUND(100.0 + 400.0 * RAND())AS random_number,但是现在可以处理我的查询
TNK 2013年

random_number列必须与我的查询一起随机生成。
TNK

1
此方法将减少第一个和最后一个数字的可能性。
Slobodan Pejic

4

除了这个答案,创建一个类似的功能

CREATE FUNCTION myrandom(
    pmin INTEGER,
    pmax INTEGER
)
RETURNS INTEGER(11)
DETERMINISTIC
NO SQL
SQL SECURITY DEFINER
BEGIN
  RETURN floor(pmin+RAND()*(pmax-pmin));
END; 

并像

SELECT myrandom(100,300);

这将为您提供100到300之间的随机数


3

您可以使用FLOOR(RAND() * n) as randnum(n是整数)创建一个随机数,但是,如果您不需要重复相同的随机数,则必须将其存储在临时表中。所以你可以用where randnum not in (select * from temptable)... 检查它


3

这些都很好地工作:

select round(<maxNumber>*rand())

FLOOR(RAND() * (<max> - <min> + 1)) + <min> // generates a number
between <min> and <max> inclusive.

0

这是从i以下j位置查找整数的正确公式i <= R <= j

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

3
这是错误的,它将永远不会产生j(或max)。它产生一个数字i <= R <j。
jlh 2015年

1
应该是:FLOOR(min+RAND()*(max-min+1))
David Rodrigues
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.