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 的功能的主要内容,如果未能解决你的问题,请参考以下文章

PHP获取随机数的函数rand()和mt_rand()

没有目标的项目是在做无用功

查看一个braintree事务是不是有成功状态

SparkSQL:jdbc 数据源是不是有“filterPushdown”功能

mysql replication

mt_rand() 函数