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

Losowanie bez powtórzeń problem ze zrozumieniem

Ostatnio zmodyfikowano 2015-07-21 22:52
Autor Wiadomość
kapelusznik
Temat założony przez niniejszego użytkownika
Losowanie bez powtórzeń problem ze zrozumieniem
» 2015-07-19 22:08:28
Witam nie mogę zrozumieć dlaczego w tym kodzie:

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int wylosuj()
{
    return( rand() % 10 ) + 1;
}

bool czyByla( int liczba, int wylosowane, int losowe[] )
{
    if( wylosowane <= 0 )
         return false;
   
    int i = 0;
    do
    {
        if( losowe[ i ] == liczba )
             return true;
       
        i++;
    } while( i < wylosowane );
   
    return false;
}

int wypisz( int losowe[], int wylosowane )
{
    do
    {
        cout << losowe[ wylosowane ] << endl;
        wylosowane++;
    } while( wylosowane < 5 );
   
}

int main()
{
   
    int losowe[ 10 ];
    int wylosowane = 0;
    int liczba;
   
    srand( time( NULL ) );
   
    do
    {
        liczba = wylosuj();
        if( czyByla( liczba, wylosowane, losowe ) == false )
        {
            losowe[ wylosowane ] = liczba;
            wylosowane++;
        }
    } while( wylosowane < 5 );
   
    wylosowane = 0;
    wypisz( losowe, wylosowane );
   
    return 0;
}

Jest to:

C/C++
do
{
    if( losowe[ i ] == liczba )
         return true;
   
    i++;
} while( i < wylosowane );

return false;

Nie mogę poprostu zapisać tego w taki sposób:

C/C++
if( losowe[ i ] == liczba )
     return true;
else
     return false;


Po co mi tu pętla?
P-134939
JMII89
» 2015-07-19 23:41:41
A w jaki sposób chcesz się przejść po tablicy jak nie pętlą ? Twój przykład jest zły bo przecież będziesz sprawdzał tylko jeden indeks czyli tab[0]. W tej funkcji chodzi o to aby sprawdzić czy w danej tablicy istnieje już liczba wylosowana.
P-134941
carlosmay
» 2015-07-20 00:12:17
C/C++
do
{
    if( losowe[ i ] == liczba )
         return true;
   
    i++;
} while( i < wylosowane );

return false;
bo w tej funkcji musisz porównać wszystkie istniejące elementy tablicy z liczbą wylosowaną i jak natrafisz na taką to
C/C++
return true;
wraca do miejsca wywołania i wymusza losowanie nowej liczby.

Natomiast
C/C++
return false;
daje znać, że liczba wylosowana nigdzie nie powtarza się więc należy ją dodać, ale dopiero po przejściu po całej tablicy.
Jak zrobisz na skróty po swojemu to w pierwszym przebiegu wrócisz z funkcji nie sprawdzając całej tablicy, bo niezależnie od wartości w warunku zadziała jeden z return'ów.
P-134943
kapelusznik
Temat założony przez niniejszego użytkownika
» 2015-07-21 22:52:38
Dzięki wszystkim za pomoc już zrozumiałem!
P-135054
« 1 »
  Strona 1 z 1