ORDER BY RAND()似乎不是随机的

时间:2012-04-04 18:10:19

标签: mysql sql random statistics

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

SELECT foo FROM bar ORDER BY rank, RAND()

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

在目前的样本数据中,有六个结果具有相等的等级(整数零)。有很多关于随机性的测试,但这是一个简单的手工测试:当运行两次时,第一个结果在两次运行中应该相同,大约六分之一时间。这肯定没有发生,主要结果至少有三分之一。

我希望在排列上进行统一分配。我不是专家统计学家,但我很确定ORDER BY RAND()应该达到这个目标。我错过了什么?

使用MySQL,SELECT rand(), rand()显示两个不同的数字,所以我不买“每个查询一次”的解释

2 个答案:

答案 0 :(得分:3)

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;

答案 1 :(得分:1)

无法为每一行刷新RAND()。可能的解决方案可能是:

SELECT foo FROM bar ORDER BY rank, CHECKSUM(NEWID())