• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

losowanie bez powtarzania

Object Storage Arubacloud
0 głosów
450 wizyt
pytanie zadane 28 kwietnia 2017 w C i C++ przez vasquez Początkujący (480 p.)

Program w ogóle nie chce działać. Pomoże ktoś?

#include <iostream>
#include <time.h>
#include <cstdlib>

using namespace std;

int losowacz()
{
    return rand()%10+1;

}

bool spraw(int liczba, int tab[], int ile)
{
    if (ile<=0) return false;

    int i=0;
    do
    {
        if ( liczba == tab [ ile ] ) return true;
       ile ++;
    }while(i<ile);
    return false;
}

int main()
{
    srand(time(NULL));
    int los;
    int i=0;
    int numer=1;
    int liczby [5];
    do
    {
       los=losowacz();

       if (spraw(los, liczby, i) == false)
       {
           los=liczby[i];
           i++;
       }
    }while (i<5);

     i=0;
     do
     {
        cout << "wylosowana liczba numer " << numer <<": "<< liczby[i] << endl;
        i++;
        numer++;
     }while (i<5);

    return 0;
}

 

3 odpowiedzi

0 głosów
odpowiedź 2 maja 2017 przez k222 Nałogowiec (30,150 p.)
wybrane 2 maja 2017 przez vasquez
 
Najlepsza

Proponuję dodanie komentarzy czy czegokolwiek wyjaśniającego jak to ma dokładnie działać bo ok można się domyśleć z kodu ale po pierwsze ten kod jak widzę nie do końca działa poprawnie a poza tym z komentarzami by było łatwiej. A więc moje sugestie:

masz tablicę liczby[5] do której nie wprowadzasz danych, więc znajdują tam się śmieci, jakieś losowe liczby które możesz odczytać, ale dalej są losowe i brzydkie, 

a więc w programie losujesz jakąś liczbę, potem sprawdzasz czy jest w tablicy i tutaj pojawia się pierwszy błąd bo w tablicy nie ma nic więc są śmieci więc raczej nie znajdziesz tam ładnych liczb z przedziału <1;10>, a dalej ponieważ nie ma tej liczby w tablicy to wykonuje się linijka:

los=liczby[i];

czyli przypisujesz wartość z tablicy do zmiennej los (czy to nie powinno być na odwrót ?????????)

liczby[i] = los;

a na końcu czytasz liczby z tablicy w której dalej są śmieci które są wypisywane.

Generalnie wszystko działa ale chyba nie powinno działać w ten sposób, a więc chyba powinieneś zrobić dwie rzeczy: odwrócić ten zapis który pokazałem powyżej i najlepiej uzupełnić tablicę liczby takimi liczbami które nie pojawią się w losowaniu np. zerami lub -1, to drugie jest opcjonalne ale nie zaszkodzi (gdybyś tak zrobił na początku to błąd łatwiej było by wykryć)

komentarz 2 maja 2017 przez vasquez Początkujący (480 p.)
Działa. Dziękuję za wnikliwe wytłumaczenie. Pomysł z komentarzami bardzo dobry. Sama będę szybciej się orientować. Dzięki.
0 głosów
odpowiedź 28 kwietnia 2017 przez SebekChlebek Stary wyjadacz (11,290 p.)
while(i<ile); <-- ten warunek będzie zawsze prawdziwy. Pętla wykonuje Ci się w nieskończoność.
0 głosów
odpowiedź 2 maja 2017 przez vasquez Początkujący (480 p.)

Poprawiłam pętle ale wychodzą za duże liczby. Analizowałam wszystko tysiąc razy, nie mam pomysłu co jest źle.

#include <iostream>
#include <time.h>
#include <cstdlib>

using namespace std;

int losowacz()
{
    return rand()%10+1;

}

bool spraw(int liczba, int tab[], int ile)
{
    if (ile<=0) return false;

    int i=0;
    do
    {
        if ( liczba == tab [ i ] ) return true;
       i ++;
    }while(i<ile);
    return false;
}

int main()
{
    srand(time(NULL));
    int los;
    int i=0;
    int numer=1;
    int liczby [5];
    do
    {
       los=losowacz();

       if (spraw(los, liczby, i) == false)
       {
           los=liczby[i];
           i++;
       }
    }while (i<5);

     i=0;
     do
     {
        cout << "wylosowana liczba numer " << numer <<": "<< liczby[i] << endl;
        i++;
        numer++;
     }while (i<5);

    return 0;
}

 

komentarz 2 maja 2017 przez 10kw10 Pasjonat (22,880 p.)
los=liczby[i];

Raczej na odwrot ;)

Podobne pytania

0 głosów
2 odpowiedzi 590 wizyt
pytanie zadane 29 października 2016 w C i C++ przez BlueWee Użytkownik (730 p.)
0 głosów
4 odpowiedzi 238 wizyt
pytanie zadane 17 sierpnia 2015 w C i C++ przez Iras Obywatel (1,800 p.)
–1 głos
0 odpowiedzi 1,970 wizyt

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...