加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 种子洗牌可以逆转吗?

发布时间:2020-12-13 17:47:22 所属栏目:PHP教程 来源:网络整理
导读:采取这个函数,这是种子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--
采取这个函数,这是种子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.)

解决方法

原来答案是肯定的,非常简单:

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]];
    }
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读