gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 22:11:29 25 4
gpt4 key购买 nike

采用这个函数,这是一个种子 Fisher-Yates 洗牌(顺序是随机的,但在给定相同种子的情况下可重现):

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

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

关于php - 种子洗牌可以逆转吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24262147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com