2014-10-06 90 views
0

我試着寫下列情況下的算法:特殊隨機算法,對PHP

  • 有是有一些/串數(N)變量(挑選任何類型)
  • 有一個米長的二維陣列:

陣列的一個例子:

$variations = array(
    array('1.1', '1.2', '1.3'), 
    array('2.1', '2.2', '2.3'), 
    array('3.1', '3.2', '3.3'), 
    array('4.1', '4.2', '4.3', '4.4'), 
    array('5.1', '5.2', '5.3'), 
    array('6.1', '6.2', '6.3'), 
    array('7.1', '7.2', '7.3'), 
    ... 
    array('M.1', 'M.2', 'M.3', 'M.4', 'M.5') 
); 

對於每個變量I需要的從從每個級別的陣列,例如獲得值的唯一組合:

  • 參數是567,結果是1.2,2.3,3.1,4.1,5.2,6.1,7.3,... M.4
  • 參數是1000,結果是1.3,2.1,3.3,4.3,5.1,6.2,7.1,... M.1
  • ...
  • 參數是567,結果是1.2,2.3,3.1,4.1, 5.2,6.1,7.3,... M.4

更新:如果我再次提供相同的參數值,結果應該是相同的。

有沒有人有任何建議?

+0

你想從每個子陣列中選擇一個隨機項目? – AbraCadaver 2014-10-06 17:27:03

+0

這個例子需要我多一點澄清。 – boomoto 2014-10-06 17:28:39

+0

我應該這樣工作:對於我提供的每個參數,它應該通過$ variations數組並從每個嵌套數組中選取一個項目。例如。我提供了「537」作爲參數,那麼它將從第一項開始(例如)「1.2」,然後從第二項開始2.3,然後從第三項開始,然後從3.1開始,直到最後一個「M.4」。它應該保持相同的值相同的變化,並使其不同,如果參數不相等。 – Grin 2014-10-06 17:31:29

回答

2

這聽起來像你想從每個子陣列選擇一個隨機項:

srand($param); 
foreach($variations as $values) { 
    $result[] = $values[array_rand($values)]; 
} 
// if you want a string list instead of an array 
$result = implode(',', $result); 
// reset the random seed 
srand(); 
+0

沒有確切的結果應該是相同的,如果我再次提供相同的參數值。我更新了我的問題。 – Grin 2014-10-06 17:35:40

+0

已編輯:使用參數對隨機數生成器進行播種。 – AbraCadaver 2014-10-06 17:41:31

+0

謝謝AbraCadaver! – Grin 2014-10-07 12:31:38

0

如果你正在尋找從一個陣列的$variations數組中隨機選擇,可以循環通過他們並根據價值量選擇一些東西。

<?php 

$variations = array(
    array('1.1', '1.2', '1.3'), 
    array('2.1', '2.2', '2.3'), 
    array('3.1', '3.2', '3.3'), 
    array('4.1', '4.2', '4.3', '4.4'), 
    array('5.1', '5.2', '5.3'), 
    array('6.1', '6.2', '6.3'), 
    array('7.1', '7.2', '7.3'), 
    array('M.1', 'M.2', 'M.3', 'M.4', 'M.5') 
); 

$unique = array(); 
foreach ($variations as $arr) { 
    $unique[] = $arr[rand(0, (count($arr) - 1))]; 
} 

print_r($unique); 
+0

沒有確切的結果應該是相同的,如果我再次提供相同的參數值。 – Grin 2014-10-06 17:34:11

0

你要求的是pseudo random number generator,因爲數量取決於最初的種子。

srand(1001); // seeding the random number 
print_r(rand()); // run it 10x, always the same result. 

如果你提供了一些說X,你有srand(D+X+1); .... srand(D+X+M);種子哪裏D=initial number。並且每輸出一個srand()rand(),使用該函數對該特定數組進行洗牌並選擇一個數字。

如何「做洗牌」?一個例子可以將所有數字加起來(4 + 6 + 9 + 3 + 5 + 3 + 9 + 3 + 2 = 44)並開始計算第44個項目,(即:44 mod [array of array in array ])