MYSQL 是不是有类似 mt_rand 的功能
Posted
技术标签:
【中文标题】MYSQL 是不是有类似 mt_rand 的功能【英文标题】:Is there a similar function like mt_rand for MYSQLMYSQL 是否有类似 mt_rand 的功能 【发布时间】:2015-11-21 02:24:34 【问题描述】:mysql 有没有类似 mt_rand 的函数?我到处搜索,但似乎找不到。
【问题讨论】:
没有种子的 RAND() 可能与 mt_rand() 类似。至于在区间中获取随机数,唯一的想法是使用 RAND() 输出 ***.com/questions/14865632/… 构建区间 【参考方案1】:DELIMITER $$
CREATE FUNCTION `my_rand`(`arg_min` INT, `arg_max` INT) RETURNS int(11)
BEGIN
RETURN ROUND( arg_min + RAND( ) * (arg_max-arg_min) );
END
调用:
SELECT my_rand(10,15)
将输出一个介于 10 和 15 之间的整数。
作为旁注......如果你想要 mt_rand 的好处,打算使用“Marsenne Twister”,那么我担心你应该寻找一个 UDF 实现(也许你应该检查这个 Statistics for mySQL) .
如果您寻找一个简单地在 min 和 max 之间输出随机整数的函数,这应该可以解决问题。
此外,如果我们将 FLOOR 用作舍入函数,那么根据我的示例,将不可能得到 15。
这是因为,根据文档:
RAND() 返回 0
在 RAND 之后立即阅读,您可以在文档中找到 ROUND ...它指出 ROUND 具有非常依赖于实现的舍入行为,因此它的行为可能会在 mysql 版本之间发生变化(并且已经改变)。这可能是文档建议使用 FLOOR 而不是 ROUND 舍入 RAND 的原因。所以,基本上哪个选择最好是有争议的……“FLOOR or ROUND,做出你的选择……”
最后...看看这篇文章。这可能看起来很可怕,但至少它清楚地表明这个问题确实是“困难的”。
Order by RAND() by Jan Kneschke
【讨论】:
我实际上只是想从数据库中获取一个随机行,但我希望该行是非常非常随机的,而不是不太随机的随机。 这应该会给出更多指示:***.com/questions/7966430/… 这对于固定数据库来说是件好事。一个不会经常插入新行的数据库,就像 OP 所说的那样。不幸的是我的。 我不确定。您可以在您的订单中使用 rand()... 即使数据库的内容发生变化,这也完全可以。链接帖子中 OP 的问题在于他实际上并不只需要一个简单的随机选择。他说:“我的问题是查询可能会重复运行,如果选择了一行,则必须始终选择它。所以使用常量种子是行不通的。 rand() 虽然不如 mt_rand 随机,而且 mysql 没有 mt_rand 函数。以上是关于MYSQL 是不是有类似 mt_rand 的功能的主要内容,如果未能解决你的问题,请参考以下文章