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

spr*_*aff 5 mysql sql random statistics

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

SELECT foo FROM bar ORDER BY rank, RAND()
Run Code Online (Sandbox Code Playgroud)

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

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

我希望在排列上有统一的分布.我不是专家统计学家,但我很确定ORDER BY RAND()应该做到这一点.我错过了什么?

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

Yuc*_*uck 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;
Run Code Online (Sandbox Code Playgroud)

  • @Jason - 那么你会用什么?(2008 年 `CRYPT_GEN_RANDOM` 可用,但假设以前的版本) (3认同)
  • @Jason 是的,是的。当专门使用 MS SQL Server 时,这是一种可接受的做法。http://stackoverflow.com/questions/4979799/order-by-newid-how-does-it-work 请参阅 Martin Smith 关于该主题的回答,以及无数其他提倡相同内容的文章。 (2认同)