我有1万个ID,这些ID最初是按标准的升序排序的。 我需要以一种特定的方式对这些ID进行洗牌,以便以后可以复制生成的序列。
很明显,如果我使用rand()或mt_rand(),则每次的顺序都不同,因此我需要某种方法,可以使项目具有可预测的结果。
这是我之前尝试过的:
errorHandler
此方法有效,但我正在寻找更优雅,更快捷的方法
UPD:感谢@Andrew提到$ seed概念。 在此基础上,我制定了一种简单快速的方法,可以按可预测的顺序随机播放项目:
app.js
答案 0 :(得分:2)
您正在寻找Fisher-Yates shuffle或至少是它的变体。
您必须根据种子将它们洗牌。由于存储种子比存储X编号的整个序列要容易得多。
最简单的实现如下所示:
$items = [1, 2, 3, 4];
function shuffleSeed(&$items, $seed) {
$items = array_values($items);
mt_srand($seed);
$count = count($items);
for ($i = $count - 1; $i > 0; $i--) {
$j = mt_rand(0, $i);
list($items[$i], $items[$j]) = [$items[$j], $items[$i]];
}
}
shuffleSeed($items, 3);
var_dump($items);
由于您说性能在这里很重要,因此使用起来可能不太好,因此必须混搭。试试吧,看看它的性能如何。