以可预测的顺序随机播放项目

时间:2018-10-03 10:38:01

标签: php sorting random sequence

我有1万个ID,这些ID最初是按标准的升序排序的。 我需要以一种特定的方式对这些ID进行洗牌,以便以后可以复制生成的序列。

很明显,如果我使用rand()或mt_rand(),则每次的顺序都不同,因此我需要某种方法,可以使项目具有可预测的结果。

这是我之前尝试过的:

errorHandler

此方法有效,但我正在寻找更优雅,更快捷的方法


UPD:感谢@Andrew提到$ seed概念。 在此基础上,我制定了一种简单快速的方法,可以按可预测的顺序随机播放项目:

app.js

1 个答案:

答案 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);

由于您说性能在这里很重要,因此使用起来可能不太好,因此必须混搭。试试吧,看看它的性能如何。