【问题标题】:Is there a similar function like mt_rand for MYSQLMYSQL 是否有类似 mt_rand 的功能
【发布时间】:2015-11-21 02:24:34
【问题描述】:

MYSQL 有没有类似 mt_rand 的函数?我到处搜索,但似乎找不到。

【问题讨论】:

标签: mysql random


【解决方案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

【讨论】:

  • 我实际上只是想从数据库中获取一个随机行,但我希望该行是非常非常随机的,而不是不太随机的随机。
  • 这应该会给出更多指示:stackoverflow.com/questions/7966430/…
  • 这对于固定数据库来说是件好事。一个不会经常插入新行的数据库,就像 OP 所说的那样。不幸的是我的。
  • 我不确定。您可以在您的订单中使用 rand()... 即使数据库的内容发生变化,这也完全可以。链接帖子中 OP 的问题在于他实际上并不只需要一个简单的随机选择。他说:“我的问题是查询可能会重复运行,如果选择了一行,则必须始终选择它。所以使用常量种子是行不通的。
  • rand() 虽然不如 mt_rand 随机,而且 mysql 没有 mt_rand 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2012-04-04
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多