【问题标题】:Can a seeded shuffle be reversed?种子洗牌可以逆转吗?
【发布时间】:2014-08-07 08:49:18
【问题描述】:

以这个函数为例,它是一个种子 Fisher-Yates shuffle(顺序是随机的,但给定相同的种子可重现):

function seeded_shuffle(array &$items, $seed = false) {
    $items = array_values($items);
    mt_srand($seed ? $seed : time());
    for ($i = count($items) - 1; $i > 0; $i--) {
        $j = mt_rand(0, $i);
        list($items[$i], $items[$j]) = array($items[$j], $items[$i]);
    }
}

这个算法可以反转吗?即,给定种子值和打乱后的数组,数组可以“打乱”到其原始顺序吗?如果有,怎么做?

(问题出现in the comments here。)

【问题讨论】:

    标签: php arrays shuffle


    【解决方案1】:

    事实证明答案是肯定的,而且非常简单:

    function seeded_unshuffle(array &$items, $seed) {
        $items = array_values($items);
    
        mt_srand($seed);
        $indices = [];
        for ($i = count($items) - 1; $i > 0; $i--) {
            $indices[$i] = mt_rand(0, $i);
        }
    
        foreach (array_reverse($indices, true) as $i => $j) {
            list($items[$i], $items[$j]) = [$items[$j], $items[$i]];
        }
    }
    

    只需使用已知种子生成相同的随机数序列,然后反向遍历即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-27
      • 2011-04-02
      • 2010-12-30
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2023-02-25
      相关资源
      最近更新 更多