【问题标题】:Shuffle items in a predictable sequence [closed]以可预测的顺序随机播放项目[关闭]
【发布时间】:2018-10-03 10:38:00
【问题描述】:

我有 10 000 个 ID,它们最初以标准升序方式排序。 我需要以特定方式对这些 ID 进行洗牌,以便以后可以复制生成的序列。

显然,如果我使用 rand() 或 mt_rand(),每次的序列都不一样,所以我需要某种方法,以可预测的结果对项目进行洗牌。

这是我之前尝试过的:

public function pseudoRandomSort(&$ids, $var1)
{
    $sorted = array();
    foreach ($ids as $id) {
        $sorted[md5($id.$var1)] = $id;            
    }
    ksort($sorted);
    $ids = array_values($sorted);
}

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


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

public function predictableShuffle(&$ids, $seed)
{
    srand($seed);
    shuffle($ids);
}

【问题讨论】:

  • 您是从数据库中获取这些 id 的吗?我的意思是他们的 id 来自表格行吗?
  • 不,它们存储在一个文件中
  • 你已经做了什么?
  • 那么,您要排序吗?不想排序?想要随机化?函数名称 pseudoRandomSort 充其量是可疑的。
  • @AlexKapustin,我这样做了:public function pseudoRandomSort(&$ids, $var1) { $sorted = array(); foreach ($ids as $id) { $sorted[md5($id.$var1)] = $id; } ksort($sorted); $ids = array_values($sorted); } 在共享主机上随机化 10 000 个 id 大约需要 0.02 秒,我想知道是否有更快的可能更优雅的方式跨度>

标签: php sorting random sequence


【解决方案1】:

您正在寻找 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);

既然你说性能在这里很重要,这可能不好用,你必须混合搭配。试一试,看看它的表现如何。

【讨论】:

  • 谢谢!使用这种方法在共享主机上随机化 10 000 个项目大约需要 0.01 秒。这个时间是可以接受的。它看起来更优雅,比我以前的临时解决方法快 2 倍。我只是稍微最小化了代码:mt_srand($seed); foreach (array_keys($items) as $i) { $j = mt_rand(0, $i); list($items[$i], $items[$j]) = array($items[$j], $items[$i]); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多