2013-10-04 82 views
2

我的問題有點複雜,但我會盡力解釋它。使用隨機密鑰從陣列中進行選擇

我有一個數組讓我們說:

$array(5){ 
     [1]=>1, 
     [2]=>2, 
     [3]=>3, 
     [4]=>4, 
     [5]=>5 
    } 

而且我有一個隨機生成的密鑰,比方說$rand = 34526147;密鑰的長度總是相同的。

現在的問題是:我想從數組中隨機排序的按鍵,但基於我們的關鍵。我的意思是,當我給相同的鍵時,它將始終返回相同的順序,但如果我更改該鍵,它將返回不同的有序數組。謝謝。

+0

對不起,我不喜歡我不明白這個問題。你可以添加一些例子嗎? –

+1

你的意思是使用'$ rand'作爲隨機數發生器的種子? – Halcyon

+0

我們有一個問答遊戲,其中2名玩家在線互相玩遊戲。問題順序是從數據庫中隨機選擇的,但是兩個玩家必須具有相同的問題順序。所以這兩個玩家都會生成一個唯一的密鑰。當用戶端AJAX使用特定鍵調用服務器上的PHP文件時,PHP應返回隨機排序的問題列表,這兩個球員必須相同。謝謝。 –

回答

3

我的理解是要shuffle()數組,但使之成爲提供任何$rand值一致。我也相信PHP在shuffle中使用rand(幕後),這使得可以使用srand(爲所提供的密鑰提供一致的隨機順序)。因此,隨着中說:

$rand = 34526247; 
srand($rand); 
shuffle($array); 

因爲你總是播種來自相同的「鑰匙」你應該得到一個一致的(可重複)洗牌的結果是隨機的。 (至少它做了brief test

注:這意味着$rand必須是一個數值。而且,如果在任何時候都不是,你需要將它轉換爲一個。

+0

@StephanB:我仍然覺得你可以用'srand'來覆蓋它(當你需要一個隨機數時,它可以讓你自己調用它本身)。例如每個srand(microtime(true)); rand();'call簡單地說就是'rand();' –

+0

對不起,我很快刪除了我的評論,我想在添加簡短測試後仔細檢查一下。似乎PHP沙箱緩存輸出,當我將PHP代碼複製到我的開發箱上的.php文件時,它每次都會產生不同的輸出。 –

+0

@StephanB:可能..我確實試圖改變這個值(得到一個新的洗牌輸出),然後用原來的密鑰替換原來的密鑰,並接收回前面的順序。 (雖然他們可能會MD5的源代碼並保存緩存 - 誰知道)。 –

1

uksort允許定義排序基於鍵自定義:

uksort($array,function($a,$b){ 
    global $rand; 
    return strpos(''.$rand, ''.$a) - strpos(''.$rand, ''.$b); 
}); 

注意,這個假設在$蘭特存在的所有鍵。陣列的

實例狀態:

Array ( 
    [3] => 3 
    [4] => 4 
    [5] => 5 
    [2] => 2 
    [1] => 1) 
1

除了它的id之外,你應該爲每個問題/行計算一個新的值。這個值需要隨着每個新鍵而改變,並且看起來足夠隨機給你的玩家。你可以簡單地用鑰匙,然後由最右邊的數字順序,這樣乘以ID:

$key = 1243; 
$questions = array(
    195741 => array('foo'), 
    168762 => array('bar'), 
    984133 => array('baz'), 
); 

$newquestions = array(); 
foreach ($questions as $id => $row) { 
    // calculate a random looking order depending on $key 
    $newquestions[$id * $key % 100] = $row; 
} 
ksort($newquestions); 

輸出:

Array 
(
    [19] => Array 
     (
      [0] => baz 
     ) 
    [63] => Array 
     (
      [0] => foo 
     ) 
    [66] => Array 
     (
      [0] => bar 
     ) 
) 

編輯:包括實際排序

+0

+1在盒子外面思考(儘管如果我有空的時候看看它有多可靠,我可能必須進行單元測試那是(以及碰撞可能在哪裏),現在我只給你一些榮譽;-) –

+0

謝謝,在一般流程建立後,計算可以很容易地擴展。對於非遊戲,我推薦使用流密碼或散列鏈:按ID排序,第一項獲取位置散列(id),其他所有散列都得到散列(以前的散列)。適用於我:D –

0

我可能是錯的,但是我讀到你的意思是你問你是否可以改變Q的順序來匹配rand int中給出的順序。

$questions = array(
1=>'one', 
2=>'two', 
3=>'three', 
4=>'four', 
5=>'five', 
); 

$rand = 34526147; 
$order = array_unique(str_split($rand)); 


foreach($order as $ord){ 
if(array_key_exists($ord, $questions)) { 
echo 'Q: ' . $ord . ' is ' .$questions[$ord] . PHP_EOL; 
} 
} 

給出:

問:3表示三個

問:4爲四

問:5爲五

問:2是二

Q :1是一個