Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wariacje z powtorzeniami
Forum PHP.pl > Forum > PHP
Vomit
Chciałem wygenerowac sobie wszystkie mozliwe polaczenia liter i liczb, aby stworzyly one 3 znakowy string. Wiem, ze wariacje z powtorzeniami 3 elementowe z 35 to bedzie 35^3.
Napisalem wiec takie "cos":

  1. <?php
  2.  
  3. $array = array();
  4.  
  5. function genLb( $ilosc )
  6. {
  7.  
  8. $litery = array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p','r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' );
  9. for( $y = 0; $y < $ilosc; $y++ )
  10. {
  11. $cyfra = rand(0,34);
  12. $lb .= $litery[$cyfra];
  13. }
  14.  
  15.  
  16. return $lb;
  17.  
  18. }
  19.  
  20. for( $i = 1; $i < pow(35,3); $i++ )
  21. {
  22. $lb = genLb(3);
  23. if ( !in_array($lb,$array) )
  24. {
  25. $array[] = $lb;
  26. }
  27. }
  28. sort($array);
  29. echo '<pre>';
  30. print_r($array);
  31. ?>


Problem polega na tym, ze skrypt nigdy nie chce dojsc do konca. Najwiecej do tej pory zdarzylo mi sie, ze wygenerowal 16345 rozwiazania, a powinno ich byc 42875.
Czemu tak sie dzieje? (dzialam na localhoscie)
aleksander
jakie błędy wywala?

ide do taty po materiały on ma o tych wariacjach moze cos pomoze;]
Vomit
Brak bledów. Jesli chodzi o wzor na wariacje to jest dobry. (Matematyka :: Kombinatoryka). Napisałem, ze skrypt wyswietlil mi maksymalnie. 16345 rozwiazania, a powinno ich byc 42875. Oznacza to, ze uruchamialem skrypt kilka razy, wyniki prezentuja sie nastepujaco:
ok. 5000
ok. 16000
ok. 12000
ok. 9000
ok. 16000
ok. 16000

Nie wiem dlaczego... ale skrypt tak jakby nie chce dzialac do konca. Tak jakby skonczyla mu sie moc na dalsze szukanie.
Neojawor
Więc po pierwsze, to żeby kod był uniwersalny (nie tylko na 3 litery), to:
  1. <?php
  2. for( $i = 1; $i < pow(35,$ilosc); $i++ )
  3. ?>

a po drugie, to czy funkcja rand() wyświetli Ci wszystkie kombinacje? byćmoże niektóre się powtórzą, a więc niektóre się nie pojawią? (szczerze mówiąc sam nie wiem, a w manualu nic nie wyczytałem) - to może być źródło problemu
scanner
Masz podstawowy błąd logiczny w algorytmie.
Wywołujesz funkcje genLB() 42875 razy. Ale nie pomyślałeś o tym, że losowanie może zwrócić 42875 razy ten sam wynik?

Pozatym - 42875 razy wywołujesz potegowanie. Brawo za optymalizację smile.gif
Spróbuj tak:
  1. <?php
  2. /**
  3. * @return array
  4. * @param int $iItems ilosc znakow w kombinacji
  5. * @param string $aAllowedChars tablica dozwolonych znakow
  6. * @desc Zwraca wszystkie kombinacje $iItems elementowych ciągów znaków mozłiwych
     do wygenerowanie z $aAllowedChars
  7. * @author scanner <scanner@scanner.eu.org>
  8. * @date 2004/11/23
  9. */
  10.  
  11. function Vars( $iItems, $aAllowedChars ) {
  12. $aResult = array();
  13. $iIteration = 0;
  14. $iLastIteration = pow( $iItems, sizeof( $aAllowedChars ) );
  15. $sAllowedChars = implode( '', $aAllowedChars );
  16.  
  17. while( $iIteration <= $iLastIteration ) {
  18. $sAllowedChars = str_shuffle( $sAllowedChars );
  19. $sItem = substr( $sAllowedChars, 0, $iItems );
  20. if( !in_array( $sItem, $aResult ) ) {
  21. $aResult[] = $sItem;
  22. $iIteration++;
  23. }
  24. }
  25. return $aResult;
  26. }
  27.  
  28. // Przykład uzycia
  29. $aAllowedChars = array_merge( range( 0, 9 ), range( 'a', 'z' ) );
  30. $aVarsArray = Vars( 3, $aAllowedChars );
  31. echo '<pre>';
  32. print_r( $aVarsArray );
  33. ?>
Vomit
Racja scanner. Pomyslalem tylko o tym, aby wygenerowanej powtornie liczby nie dodawac do tablicy, nie pomyslalem natomiast zeby nie zwiekszac $i++. Dzieki.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.