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

Błąd w losowaniu liczb.

Ostatnio zmodyfikowano 2013-12-23 16:43
Autor Wiadomość
Malakian
Temat założony przez niniejszego użytkownika
Błąd w losowaniu liczb.
» 2013-12-23 16:01:05
Witam.

Kod kompiluje sie prawidłowo jednak po wykonaniu programowi zdarza się wylosować liczbę nie z przedziału.
Przykładowe wyjście:
5,
8,
0,
2686916,
4,

Kod programu:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

// Losuje liczbe z okreslonego przedzialu
int wylosuj( int poczatek, int koniec )
{
    return(( rand() %( koniec - poczatek ) ) + poczatek );
}

// Sprawdza czy liczba juz sie nie powtorzyla w tablicy
bool randomCheck( int liczba, int t_name[], int t_lenght )
{
    if( t_lenght <= 0 ) return true;
   
    for( int i = 0; i < t_lenght; i++ ) {
        if( t_name[ i ] == liczba )
             return false;
       
    }
   
    return true;
   
}

// Main
int main()
{
    srand( time( 0 ) ); // restartuje ziarno generatora
   
    int tablicaLiczb[ 5 ];
    int liczba = 0;
   
    // główna pętla do wypełnienia tablicy
    for( int i = 0; i < 5; i++ ) {
        liczba = wylosuj( 0, 10 );
        if( randomCheck( liczba, tablicaLiczb, i ) )
             tablicaLiczb[ i ] = liczba;
       
    };
   
    // pętla do wypisania zawartości tablicy
    for( int i = 0; i < 5; i++ ) {
        std::cout << tablicaLiczb[ i ] << ", " << std::endl;
    }
   
    return 0;
}

###### ROZWIĄZANIE ######

By naprawić błąd musiałem poprawić główną pętlę oraz nieznacznie zmodyfikować funkcję randomCheck()

C/C++
// Poprawiona funkcja sprawdzająca powtarzające się liczby
bool randomCheck( int liczba, int t_name[], int t_lenght )
{
    if( t_lenght <= 0 ) return false;
   
    for( int i = 0; i < t_lenght; i++ ) {
        if( t_name[ i ] == liczba )
             return true;
       
    }
    return false;
}



// Główna pętla
for( int i = 0; i < 5; i++ ) {
    do
    {
        liczba = wylosuj( 0, 10 );
    }
    while( randomCheck( liczba, tablicaLiczb, i ) );
   
    tablicaLiczb[ i ] = liczba;
};
P-99951
pekfos
» 2013-12-23 16:09:42
Jeśli wylosowana liczba się powtarza, idziesz dalej i zostawiasz niezdefiniowaną wartość w tablicy.
P-99954
Malakian
Temat założony przez niniejszego użytkownika
» 2013-12-23 16:17:25
Dzięki mistrzu, już poprawiam.
P-99959
pekfos
» 2013-12-23 16:43:18
W zasadzie wystarczyło dopisać
else --i;
 za warunkiem sprawdzającym. Najprostsze rozwiązania zwykle są najlepsze ;)
W Twoim rozwiązaniu przerabianie randomCheck() nie jest potrzebne. Wystarczy zanegować wartość otrzymaną z funkcji, albo porównać ją z false.
P-99960
« 1 »
  Strona 1 z 1