所以我有一個數組[ A,A,B,B,B,C,C,C,C,C ]
,我需要隨機混洗/隨機化,它會隨機地排序項目,但保持相同的值儘可能分開。 最好的結果將是[ C,A,B,C,A,B,C,B,C,C ]
php array shuffle/randomize array所以沒有兩個相等的值不在
到目前爲止我的代碼:
<?php
$UnitedList = [
'A',
'A',
'B',
'B',
'B',
'C',
'C',
'C',
'C',
'C'
];
$mixed_list = [];
$i = 0;
function getKey(&$array, $not) {
$rk = array_rand($array);
// echo $rk;
if ($array[$rk] !== $not || count(array_unique($array)) === 1) {
return $rk;
}
return getKey($array, $not);
}
while (!empty($UnitedList)) {
$randomk = array_rand($UnitedList);
if ($i === 0) {
$mixed_list[] = $UnitedList[$randomk];
unset($UnitedList[$randomk]);
++$i;
continue;
}
if (isset($mixed_list[$i - 1]) && $mixed_list[$i - 1] !== $UnitedList[$randomk]) {
$mixed_list[] = $UnitedList[$randomk];
unset($UnitedList[$randomk]);
++$i;
continue;
}
if (isset($mixed_list[$i - 1]) && $mixed_list[$i - 1] === $UnitedList[$randomk]) {
$newk = getKey($UnitedList, $UnitedList[$randomk]);
$mixed_list[] = $UnitedList[$newk];
unset($UnitedList[$newk]);
++$i;
continue;
}
++$i;
continue;
}
print_r($mixed_list);
>
最好成績:
Array
(
[0] => A
[1] => C
[2] => A
[3] => C
[4] => B
[5] => C
[6] => B
[7] => C
[8] => B
[9] => C
)
最壞的結果:
Array
(
[0] => A
[1] => B
[2] => A
[3] => C
[4] => B
[5] => C
[6] => B
[7] => C
[8] => C
[9] => C
)
我需要以某種方式,禁止最壞的結果類型的結果,當有一排3℃,更好的是,如果至少3 C可在陣列
所以,你不想隨意。在這種情況下,我建議你創建一個理想的訂單列表,並且只是隨機化開始點。 – Burki
不能這樣做,因爲INPUT列表是動態的,一次可以是[A,A,A,B,B,C,C,C,D,D]其他[A,A,B,B,C ] – Makarons
將數組排序爲唯一的組,然後隨機選擇一個組。跟蹤該組並隨機選擇一個不屬於當前組的組。重複,直到值用完。 – Tigger