Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Losowanie bez powtórzeń.

Ostatnio zmodyfikowano 2012-08-05 01:21
Autor Wiadomość
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:
C/C++
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ę:
C/C++
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 :)
P-61772
kamillo121
» 2012-08-05 01:10:58
Witam, tak na pierwszy rzut oka to:

C/C++
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:
C/C++
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.

C/C++
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 );
   
}
P-61773
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 :)
P-61775
« 1 »
  Strona 1 z 1