mysql - ORDER BY RAND() 似乎不那么随机

标签 mysql sql random statistics

我有一个相当简单的 SQL (MySQL):

SELECT foo FROM bar ORDER BY rank, RAND()

我注意到当我刷新结果时,随机性很弱。

目前样本数据中有六个排名相同的结果(整数零)。有很多随机性测试,但这里有一个简单的手动测试:运行两次时,两次运行的第一个结果应该相同,大约有六分之一的时间。这肯定不会发生,领先的结果至少有三分之一的时间是相同的。

我想要对排列进行均匀分布。我不是专家统计学家,但我很确定 ORDER BY RAND() 应该可以做到这一点。我错过了什么?

对于 MySQL,SELECT rand(), rand() 显示两个不同的数字,所以我不相信“每个查询一次”的解释

最佳答案

RAND() is only executed once per query.您可以通过查看结果集来验证这一点。

如果您尝试获得随机顺序,您应该使用 NEWID()CHECKSUM(NEWID())

WITH T AS ( -- example using RAND()
  SELECT 'Me' Name UNION SELECT 'You' UNION SELECT 'Another'
)
SELECT Name, RAND()
FROM T;

WITH T AS ( -- example using just NEWID()
  SELECT 'Me' Name UNION SELECT 'You' UNION SELECT 'Another'
)
SELECT Name, NEWID()
FROM T;

WITH T AS ( -- example getting the CHECKSUM() of NEWID()
  SELECT 'Me' Name UNION SELECT 'You' UNION SELECT 'Another'
)
SELECT Name, CHECKSUM(NEWID())
FROM T;

关于mysql - ORDER BY RAND() 似乎不那么随机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10016888/

相关文章:

php - SQL 查询问题中 DISTINCT 和 <> 的输出

java - Java 随机生成器的最佳实践

c++ - 生成随机长度的随机数字串

sql - 在 SQL Server 2017 中修改多个 JSON 数组元素

mysql - 在多个表中截断

random - SAS 随机采样

sql - MySQL如何从[存储过程]插入[临时表]

mysql - 重置关系表mysql中的行ID

php - 这些查询可以变成 REPLACE INTO 吗?

mysql - SQL/MySQL : common design of row number/index/offest for pagination