5

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

SELECT foo FROM bar ORDER BY rank, RAND()

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

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

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

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

4

2 回答 2

3

RAND()每个查询只执行一次。您可以通过查看结果集来验证这一点。

如果您尝试获得随机顺序,则应该使用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;
于 2012-04-04T18:14:36.323 回答
1

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

SELECT foo FROM bar ORDER BY rank, CHECKSUM(NEWID())
于 2012-04-04T18:15:04.920 回答