2014-06-17 41 views
4

拿這個功能,這是一個種子費雪耶茨洗牌(順序是隨機的,但可重複給予相同的種子):種子洗牌可以顛倒嗎?

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)。

回答

7

原來答案是肯定的,而且很簡單:

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

使用已知的種子就產生相同的隨機數序列,並遍歷它相反。

+0

幹得好!非常感謝! :-) – nils