ORDER BY RAND()似乎是小于随机(ORDER BY RAND() seems to be

2019-06-23 09:58发布

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

SELECT foo FROM bar ORDER BY rank, RAND()

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

在此刻的样本数据有六个结果与等于秩(整数零)。 有很多的随机性测试,但这里是一个简单的手工做的事: 运行两次时,第一个结果应该是一样的在两个运行约六分之一的时间 。 这肯定不会发生,导致的结果是时间的相同的至少三分之一。

我想在排列均匀分布。 我不是专家,统计学家,但我敢肯定ORDER BY RAND()要达到这一点。 我在想什么?

与MySQL, SELECT rand(), rand()显示两个不同的号码,所以我不买了“每一次查询”的解释

Answer 1:

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;


Answer 2:

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

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


文章来源: ORDER BY RAND() seems to be less than random