Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wariacje z powtorzeniami, trzyelementowe z 35
Vomit
post
Post #1





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 23.01.2006

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
scanner
post
Post #2





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




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ę (IMG:http://forum.php.pl/style_emoticons/default/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. ?>
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 9.10.2025 - 03:10