Генериране на числови комбинации с PHP

primecode

Active Member
Малко зациклих с алгоритъма и освен главоболие друго не постигнах :)
Затруднявам се при следната задача:
Трябва да получа комбинация от 5 предварително зададени (непоредни) числа, като едно от тях винаги е на определена позиция. Т.е. се получава че комбинираме 4 от тези 5 числа а избраното се поставя на определената позиция. Въпроса ми е с генерирането на числата по начин по който да няма повтаряне на комбинация. Това може да стане с проверка ако вече създадените комбинации се пазят в масив и се проверява за такава стойност но не съм сигурен дали съм прав и дали е най-удачно. Плюс това колкото повече комбинации има толкова повече ще са и повторенията, което смятам за излишно. Все пак си мисля, че има и други начини но ... зациклих. Приемам всякакви идеи.

EDIT:
15:10 Току що намерих този пост в Г :D
 
Последно редактирано:
От: Генериране на числови комбинации с PHP

И аз си мисля, че само с масив и проверка може да стане това което искаш, и не се сещам за друг начин за жалост.
 
От: Генериране на числови комбинации с PHP

Ще се главоблъскам още малко. Посрещам всякакви идеи. А накрая ще пусна резултата, че не се знае кой още може да се тормози с това след време.
 
От: Генериране на числови комбинации с PHP

Определената позиция на 5-тото число винаги ли е в началото / края / средата и т.н. или се менка ? В смисъл винаги определена за определен цикъл или си е перманенто там. При вариантите в начало / край ти трябва 4 цифрено число, което да не се повтаря. Можеш да определиш някакви диапазони примерно според ден/час/секунди/милисекунди в които да трябва да попада това число и от там да се опиташ вече да го съставиш. При този вариант до даден период от време ще имаш сравнително уникални комбинации. Ако не става вече на рандом. Без проверка в масив си нямам идея как ще минеш ...

Просто идея : )
 
Последно редактирано:
От: Генериране на числови комбинации с PHP

В случая ще бъде 3-та позиция, но това няма значение защото може да се броят изведените числа и да се поставя веднага след 2-рото например.
 
От: Генериране на числови комбинации с PHP

ако съм вдянал задачата правилно, търсиш това:
PHP:
$arr = array();
while ( count($arr) < 10 ) {
    $x = mt_rand(1,10); 
    if ( !in_array($x,$arr) ) { $arr[] = $x; echo "$x<br>"; }
}

или бъркам?
 
От: От: Генериране на числови комбинации с PHP

ако съм вдянал задачата правилно, търсиш това:
PHP:
$arr = array();
while ( count($arr) < 10 ) {
    $x = mt_rand(1,10); 
    if ( !in_array($x,$arr) ) { $arr[] = $x; echo "$x<br>"; }
}

или бъркам?

Не. Друго имам предвид.
Числата са определени. Например искам различните комбинации от числата 2,4,9 и 0.
След малко пускам моя резултат.
 
От: От: Генериране на числови комбинации с PHP

Ето го моя резултат до момента.
PHP:
<?php
$number = array();
$number[] = 2;
$number[] = 5;
$number[] = 9;
#$number[] = 0;

$count = count($number)-1;

for ($i = 0; $i <= $count; $i++) {
    if ( $i == 2 ) {
        echo 0;    
    }
  $rand = array_rand($number, 1);
  echo $number[$rand];
  unset($number[$rand]);
}
?>

Сега просто трябва да създавам един масив в който всяка комбинация да се добавя но преди това да се проверява дали не съществува в същия. Което пък сега ме подсеща - какъв ще е критерия за броя повторения в цикъла, т.е. до кога ще върти комбинации и ще ги проверява?
 
От: Генериране на числови комбинации с PHP

PHP:
$search_arr = array(12556, 25512, 67552);
$number = array();
$number[1] = 2;
$number[2] = 5;
$number[3] = 9;
$number[4] = 0;
$number_five = 5;

for ($i = 0; $i < 1; $i++) {
  
  $stop++;
  
  shuffle($number);

  foreach ($number as $new_number ) {
    $s++;
    if ( $s == 3 ) $result .= $number_five;
    $result .= $new_number;
  }
  
  if ( in_array($result, $search_arr) && $stop < 500 ) { $i=0; $s=0; $result=''; }

  echo $result;

}
Този вариант ?
 
Последно редактирано:
От: От: Генериране на числови комбинации с PHP

Не, и това не ми върши това което искам.
Ще опитам пак да поясня, може би не съм се изказал правилно.
Имам 3 числа + едно число за което има определена позиция.
Всички 3 числа трябва да бъдат изведени във всяка възможна комбинация без да се повтарят.
 
От: Генериране на числови комбинации с PHP

Т.Е. на изхода трябва да имаш масив със всички възможни комбинации, а не просто един резултат, който да не се повтаря в зададен преди това масив ...
 
От: Генериране на числови комбинации с PHP

Да, точно така. Трябват ми всички възможни комбинации с числата в масива, които не са поредни.
Ето това имам засега, показва само една комбинация от възможните като добавя 3-то число което е нула:
PHP:
<?php
function shuffles() {
	$number = array(2,6,8);
	$count = count($number);
	$c = '';
	for ($i = 0; $i <= $count-1; $i++) {
  if ( $i == 2 ) {
   $c .= 0;
  }
  $rand = array_rand($number, 1);
  $c .= $number[$rand];
  unset($number[$rand]);
	}
	return $c;
}

echo shuffles();?>
 
От: Генериране на числови комбинации с PHP

И така, сега имам вече това което ми трябва, но понеже съм слаб с математиката :( ..... не знам как да изчисля броя комбинации.

PHP:
<?php
function shuffles() {
	$number = array(2,6,8);
	$count = count($number);
	$c = '';
	for ($i = 0; $i <= $count-1; $i++) {
  if ( $i == 2 ) {
   $c .= 0;
  }
  $rand = array_rand($number, 1);
  $c .= $number[$rand];
  unset($number[$rand]);
	}
	return $c;
}


$combinations = 3;
$summary = array();
  while ( count($summary) < $combinations ) {
  $comb = shuffles();
  #echo $comb.'<br />';
  if ( !in_array($comb, $summary) ) {
    array_push($summary, $comb);
  }
}

print_r($summary);

?>
на променливата $combinations съм задал броя комбинации които да ми даде. Може да се направи и си пресмятане според броя на ключовете в масива, но математически не ми е ясно как се смятат брой комбинаци от N числа. Така ще може да работи и с повече или по-малко числа.
 
От: Генериране на числови комбинации с PHP

Лисицата спече, обърках нещо :D
Сега, по предното функцията shuffles() ми дава случайна комбинация от числата в масива, в цъкъла с while събирам комбинациите в друг масив стига да не съществува тази комбинация в масива в който слагам комбинациите. Проблема ми е с променливата $combinations на която съм и дал комбинациите да са 3. А искам да бъдат колкото могат да бъдат, т.е. всички възможни.
Мисля, че в случая с трите цифри възможните комбинации ще са 1*2*3=6, но само аз така си мисля. А ако са 10? На мен ми трябват само тези комбинации с 3 числа. Правилно ли мисля, че с 1*2*3 ще получа броя на възможните комбинации?
 
От: От: Генериране на числови комбинации с PHP

PHP:
function permutate($n, $add_char, $add_after) {
            global $numbers;
            global $length;
            global $s;
            global $result;
 
              if ($n==1) {
              $s++;
                for ($i=0; $i< $length; $i++) { 
                          if ($i == $add_after) $result[$s] .= $add_char;
                          $result[$s] .= $numbers[$i];
                          }
              }
                else {
                   for ($i=0; $i< $n; $i++) {
                    $tmp = $numbers[$i];
                    $numbers[$i] = $numbers[$n - 1];
                    $numbers[$n - 1] = $tmp;

                    permutate($n-1, $add_char, $add_after);

                    $tmp = $numbers[$i];
                    $numbers[$i] = $numbers[$n - 1];
                    $numbers[$n - 1] = $tmp;
            }
            if ($i == $length && $n == $length) return $result;
        }
}

      $numbers = Array(2,4,5);
      $length = count($numbers);
      $add_char = 'd';
      $add_after = 2;
      
      $a = permutate($length, $add_char, $add_after);      
      
      print_r($a);
А така ?
 
Последно редактирано:
От: Генериране на числови комбинации с PHP

Дааа, това върши работа. Репутацийка от мен. Ще разгледам по-подробно сега. В момента виждам, че глобалната $s не е зададена никъде, но няма проблем. Ще се позанимая.
 
От: Генериране на числови комбинации с PHP

PHP:
function permutate($n, $add_char, $add_after, $stop='100') {
            global $numbers;
            global $length;
            global $s;
            global $result;
              //При достигане на стоп спира
              if ($s == $stop ) return $result;  
              
              if ($n==1) {
              $s++;
                for ($i=0; $i< $length; $i++) { 
                          if ($i == $add_after) $result[$s] .= $add_char;
                          $result[$s] .= $numbers[$i];
                          }
              }
                else {
                   for ($i=0; $i< $n; $i++) {
                    $tmp = $numbers[$i];
                    $numbers[$i] = $numbers[$n - 1];
                    $numbers[$n - 1] = $tmp;

                    permutate($n-1, $add_char, $add_after, $stop);

                    $tmp = $numbers[$i];
                    $numbers[$i] = $numbers[$n - 1];
                    $numbers[$n - 1] = $tmp;
            }
            //След всички изчерпани резултати спира
            if ( $i == $length && $n == $length ) return $result; 
            
        }
}

      $numbers = Array(2, 4, 5, a, 5, b, 5); //Масив със символи
      $length = count($numbers);
      $add_char = 'd'; //Символ за добавяне
      $add_after = 2; //Добавяне след N символ
      $stop = 100; //Брой върнати резултати
      $s = 0;
      
      $a = permutate($length, $add_char, $add_after, $stop);      
      
      print_r($a);
Ето и вариант със STOP, върши работа за комбинации на всякакви символи.

П.С. Научих нещо ново, мерси за темата : )
 
От: Генериране на числови комбинации с PHP

И за мен беше ново :)
Цялата работа е, че имам един код който не помня но имам някакъв спомен за числата в него, затова и ми трябваше този генератор за да изведа комбинациите които мога да имам за да проверя/намеря кода :)
 
От: Генериране на числови комбинации с PHP

За 1*2*3 (това се нарича факториел от 3) за 3 елемнта си прав. За 4 елемента е 1*2*3*4.
Спомням си, че преди няколко месеца решавах подобна задача и я правих без rand. Ще се понапъна още няколко минути и дано уцеля. Ако ли не, това говори кофти и за моите логически способности (чувствам се ръждясал).

П.П.:
Отдавна не бях писал тук. Здрасти на тези, които ме помнят.

Edit:
Браво за решението, но мисля, че имаше циклично решение, т.е. без рекурсия.
 
От: Генериране на числови комбинации с PHP

Споменах, че не съм сигурен в математическите изчисления защото бегло помня как имаше една формула за тото и тя не беше 1*2*3*4.....48*49
Има си някаква формула по която се пресмята но аз не знам как.
Иначе за това от което имах нужда - направих го + варианта на cybervn който също се оказа удачен.
Ама пък ако ви кажа за какво ми беше това .... голям смях ще падне :lol:
 

Горе