2014-10-06 86 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 ])