5

私はかなり単純な SQL (MySQL) を持っています:

SELECT foo FROM bar ORDER BY rank, RAND()

結果を更新すると、ランダム性が疑わしいほど弱いことに気付きました。

現時点でのサンプル データには、ランクが等しい (整数ゼロ) 6 つの結果があります。ランダム性には多くのテストがありますが、ここでは手動で行う簡単なテストを示します: 2 回実行すると、最初の結果は両方の実行で約 6 分の 1 の確率で同じになるはずです。これは確かに起こっていません。主要な結果は少なくとも 3 分の 1 の確率で同じです。

順列全体で均一な分布が必要です。私は専門家の統計学者ではありませんが、ORDER BY RAND()これを達成する必要があると確信しています。私は何が欠けていますか?

MySQL ではSELECT rand(), rand()2 つの異なる数値が表示されるため、「クエリごとに 1 回」という説明は受け入れません。

4

2 に答える 2

3

RAND()クエリごとに1回だけ実行されます。結果セットを確認することで、これを確認できます。

ランダム化された順序を取得しようとしている場合は、またはのいずれ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 に答える