Losowanie bez powtórzeń.
Ostatnio zmodyfikowano 2012-08-05 01:21
maciekargh Temat założony przez niniejszego użytkownika |
Losowanie bez powtórzeń. » 2012-08-05 00:37:04 Witam, chciałem napisać funkcję losowania bez powtórzeń do programu ale natknąłem się na dziwny błąd. Oto kod: void do_tablicy( int * t ) { int i = 0, k = 0, wylosowana; do { wylosowana = losuj(); do { if( t[ k ] == wylosowana ) { wylosowana = losuj(); k = 0; continue; } k++; } while( k < 4 ); t[ i ] = wylosowana; i++; } while( i < 4 ); } W takiej postaci kompilator zdaje się pomijać pętlę: do { if( t[ k ] == wylosowana ) { wylosowana = losuj(); k = 0; continue; } k++; } while( k < 4 ); Dopiero kiedy zamienię while(k < 4) na while(k != 4) wszystko działa poprawnie. Czy jest mi w stanie ktoś powiedzieć co napisałem źle w tej funkcji? Funkcja losuj losuje 4 liczby z przedziału od 1 do 4 :) |
|
kamillo121 |
» 2012-08-05 01:10:58 Witam, tak na pierwszy rzut oka to: void do_tablicy( int * t ) { int i = 0, k = 0, wylosowana; do { wylosowana = losuj(); do { if( t[ k ] == wylosowana ) { wylosowana = losuj(); k = 0; continue; } k++; } while( k < 4 ); t[ i ] = wylosowana; i++; } while( i < 4 ); }
przyjrzyjmy się następującej sytuacji, pierwszy obieg pętli okalającej, losuje liczbę, następnie pętla sprawdzająca czy nie została wylosowana taka liczba przejdzie każdy indeks tablicy i nic nie znajdzie. Jeżeli nic nie znajdzie to poniższy warunek się nie wykona: if( t[ k ] == wylosowana ) { wylosowana = losuj(); k = 0; continue; }
W Twoim kodzie tylko w tym miejscu w pętlach jest zerowane k. Zeruj po pętli zagnieżdżonej czyt. void do_tablicy( int * t ) { int i = 0, k = 0, wylosowana; do { wylosowana = losuj(); do { if( t[ k ] == wylosowana ) { wylosowana = losuj(); k = 0; continue; } k++; } while( k < 4 ); k = 0; t[ i ] = wylosowana; i++; } while( i < 4 ); } |
|
maciekargh Temat założony przez niniejszego użytkownika |
» 2012-08-05 01:21:54 No tak, to było proste, teraz mi głupio xD Wielkie dzięki :) |
|
« 1 » |