@salomatin

Как сделать генератор возможных комбинаций на php?

Суть вопроса такова.
5dbb48d0c61ce674630326.jpeg
У нас есть 15 строк, в каждой строке по 3 опции. Мы можем из 15 строк зафиксировать опции в нескольких.
После этого вводим количество вариантов (к примеру 3) и скрипт должен сгенерировать результат вида
1-(1);2-(2);3-(1);4-(3);5-(1);6-(1);7-(1);8-(1);9-(1);10-(1);11-(1);12-(1);13-(1);14-(1);15-(1),
1-(1);2-(2);3-(1);4-(3);5-(2);6-(1);7-(1);8-(1);9-(1);10-(1);11-(1);12-(1);13-(1);14-(1);15-(1),
1-(1);2-(2);3-(1);4-(3);5-(3);6-(1);7-(1);8-(1);9-(1);10-(1);11-(1);12-(1);13-(1);14-(1);15-(1),
Как видно выбранные варианты остаются не изменными, остальные с каждой интеграцией меняются

Делал ли кто-то подобное?
  • Вопрос задан
  • 635 просмотров
Решения вопроса 1
@salomatin Автор вопроса
Короче сделал сам, немного индусский код, но все работает

// количество цифр (К примеру 1-(1) 1-(2) 1-(3))
$n = 3;

// Количеств фиксированных вариантов (Можно посчитать при отправке через $_POST)
$k = 4;

$col_unic = pow($n, $k);
echo 'Факториал '.$col_unic.'
';

// В array можно положить значения через $_POST (В данном примере первые 4 фиксированы остальные будут заполнены автоматически)
$array = [
'1' => '1',
'2' => '3',
'3' => '1',
'4' => '2',
'5' => '',
'6' => '',
'7' => '',
'8' => '',
'9' => '',
'10' => '',
'11' => '',
'12' => '',
'13' => '',
'14' => '',
'15' => '',
];
$array_comb = array();
$array_all_comb = array();

// Количество строк
$count_combinations = 82;
// Проверяем количество возможных вариантов
$count_combinations = ($count_combinations >= $col_unic) ? $col_unic : $count_combinations;

function rand_chislo () {
global $array_comb;
global $array;
$array_comb[1] = ($array[1] == null) ? rand(1,3) : $array[1];
$array_comb[2] = ($array[2] == null) ? rand(1,3) : $array[2];
$array_comb[3] = ($array[3] == null) ? rand(1,3) : $array[3];
$array_comb[4] = ($array[4] == null) ? rand(1,3) : $array[4];
$array_comb[5] = ($array[5] == null) ? rand(1,3) : $array[5];
$array_comb[6] = ($array[6] == null) ? rand(1,3) : $array[6];
$array_comb[7] = ($array[7] == null) ? rand(1,3) : $array[7];
$array_comb[8] = ($array[8] == null) ? rand(1,3) : $array[8];
$array_comb[9] = ($array[9] == null) ? rand(1,3) : $array[9];
$array_comb[10] = ($array[10] == null) ? rand(1,3) : $array[10];
$array_comb[11] = ($array[11] == null) ? rand(1,3) : $array[11];
$array_comb[12] = ($array[12] == null) ? rand(1,3) : $array[12];
$array_comb[13] = ($array[13] == null) ? rand(1,3) : $array[13];
$array_comb[14] = ($array[14] == null) ? rand(1,3) : $array[14];
$array_comb[15] = ($array[15] == null) ? rand(1,3) : $array[15];
}
for ($i = 0; $i < $count_combinations; $i++) {
// Генерируем выборку
rand_chislo();
$array_result = '1-('.$array_comb[1].');2-('.$array_comb[2].');3-('.$array_comb[3].');4-('.$array_comb[4].');5-('.$array_comb[5].');6-('.$array_comb[6].');7-('.$array_comb[7].');8-('.$array_comb[8].');9-('.$array_comb[9].');10-('.$array_comb[10].');11-('.$array_comb[11].');12-('.$array_comb[12].');13-('.$array_comb[13].');14-('.$array_comb[14].');15-('.$array_comb[15].'),';
$unique = 0;
while ($unique < 1) {
if (in_array($array_result, $array_all_comb)) {
//echo "Такая выборка есть";
// Генерируем новую выборку
rand_chislo();
$array_result = '1-('.$array_comb[1].');2-('.$array_comb[2].');3-('.$array_comb[3].');4-('.$array_comb[4].');5-('.$array_comb[5].');6-('.$array_comb[6].');7-('.$array_comb[7].');8-('.$array_comb[8].');9-('.$array_comb[9].');10-('.$array_comb[10].');11-('.$array_comb[11].');12-('.$array_comb[12].');13-('.$array_comb[13].');14-('.$array_comb[14].');15-('.$array_comb[15].'),';
}
else {
// echo 'Новая уникальная выборка';
$unique = 1;
}
}

$array_all_comb += [$i => $array_result];

}
foreach ($array_all_comb as $key => $value) {
//echo 'KEY - '.$key.' 50;'.$value.'
';
$value = str_replace("(2)", "(X)", $value);
$value = str_replace("(3)", "(2)", $value);
echo ' 50;'.$value.'
';
}

echo '
Кол-во выборок '.count($array_all_comb);
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Adamos
@Adamos
Количество вариантов = (кол-во вариантов выбора в строке) в степени (кол-во строк).
Генерировать все возможные варианты - угрепаешься даже на небольших числах. Да никому это и не нужно.
Сгенерировать произвольный вариант - элементарно.
Берете массив длиной в кол-во строк, заполняете его случайными числами от 1 до кол-ва вариантов.
Потом в заполненных позициях заменяете это значение на номер выбранного ответа.
Вот и вся комбинаторика.
Ответ написан
Комментировать
glaphire
@glaphire Куратор тега PHP
PHP developer
Можно попробовать
1. Вынести переменчивые элементы из общего массива в новый массив
2. Комбинаторно перебрать все элементы, сгенерив массив комбинаций
3. Подставить массив комбинаций в старый массив из п.1
Алгоритм комбинаций я брала отсюда, когда нужна была похожая задача
Ответ написан
Комментировать
profesor08
@profesor08 Куратор тега PHP
$variants = [1,5,7,20];

echo $variants[rand(0, count($variants) - 1)];


Примени к той белиберде из скриншота.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы