Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wariacje z powtorzeniami, trzyelementowe z 35
Vomit
post 17.03.2006, 19:18:55
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
aleksander
post 17.03.2006, 21:49:05
Post #2





Grupa: Przyjaciele php.pl
Postów: 742
Pomógł: 0
Dołączył: 14.12.2003
Skąd: Gdańsk, Trójmiasto

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


jakie błędy wywala?

ide do taty po materiały on ma o tych wariacjach moze cos pomoze;]
Go to the top of the page
+Quote Post
Vomit
post 17.03.2006, 22:07:47
Post #3





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

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


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.
Go to the top of the page
+Quote Post
Neojawor
post 17.03.2006, 23:15:34
Post #4





Grupa: Zarejestrowani
Postów: 106
Pomógł: 1
Dołączył: 2.12.2005
Skąd: Jaworzno

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


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
Go to the top of the page
+Quote Post
scanner
post 18.03.2006, 00:02:56
Post #5





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ę 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. ?>


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
Vomit
post 18.03.2006, 09:06:38
Post #6





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

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


Racja scanner. Pomyslalem tylko o tym, aby wygenerowanej powtornie liczby nie dodawac do tablicy, nie pomyslalem natomiast zeby nie zwiekszac $i++. Dzieki.
Go to the top of the page
+Quote Post

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 Wersja Lo-Fi Aktualny czas: 15.08.2025 - 03:47