我通常不会复制现有答案,但我可以看到您在几周前发表评论要求this answer 的作者解释它是如何工作的,但没有给出任何解释。因此,我将复制相关部分并尝试解释发生了什么。如果这个解释很好,请对原始答案进行投票。
$seed = md5(mt_rand());
$prng = ('0.' . str_replace(array('0', 'a', 'b', 'c', 'd', 'e', 'f'), array('7', '3', '1', '5', '9', '8', '4'), $seed )) * 1;
$query = 'SELECT id, name FROM table ORDER BY (substr(id * ' . $prng . ', length(id) + 2)';
前两行只是关于创建某种种子。结果是一个带有很多小数的十进制数,例如:
0.54534238371923827955579364758491
然后sql select使用这个数字与SQLite表中每一行的数字行id相乘。然后根据结果产品的小数部分对行进行排序。使用较少的小数,排序顺序如下所示:
row id row id * seed sort order
1 0.545342384 545342384
2 1.090684767 090684767
3 1.636027151 636027151
4 2.181369535 181369535
5 2.726711919 726711919
6 3.272054302 272054302
7 3.817396686 817396686
8 4.362739070 362739070
排序后会是这样的结果:
row id row id * seed sort order
2 1.090684767 090684767
4 2.181369535 181369535
6 3.272054302 272054302
8 4.362739070 362739070
1 0.545342384 545342384
3 1.636027151 636027151
5 2.726711919 726711919
7 3.817396686 817396686
在这个示例中,我只使用了八行,因此结果看起来不是很随机。行越多,结果就越随机。
只要:
- 你使用相同的种子
- 表中没有出现新行,也没有从表中删除任何行