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]]; } } 只需使用已知种子生成相同的随机数序列,然后反向遍历. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |