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

losowanie bez powtórzeń - inny sposób(?)

0 głosów
486 wizyt
pytanie zadane 9 października 2018 w C i C++ przez Gadzic Nowicjusz (170 p.)

Witam!

Chciałem napisać program do losowania 5 liczb bez powtórzeń. Wiem, że jest już trochę wątków dotyczących tego, jednak moje próby rozwiązania zdają mi się być inne.

Zacząłem rozwiązywać swoje zadanie nie analizując, żadnych przykładów tylko szukając swojego rozwiązania. Dlatego może nie jest ono najlepsze i ciężko skalowalne jeżeli w ogóle, ale skoro już zacząłem to chciałbym dowiedzieć się czemu nie działa, bym lepiej mógł zrozumieć temat. Wylosowane liczby wciąż się powtarzają.

Z góry dziękuję wszystkim pomocnym tu osobą - jesteście super! yes

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int losuj()
{
    int liczba;
    liczba=((rand()%10)+1);
    return liczba;
}

int main()
{
    int liczba;
    int tablica [5];
    int i = 0;
    srand(time(NULL));

    do
    {
        tablica[i]=0; //chcialem wyzerowanie tablicy do porownywania wynikow
        i++;
    }
    while (i<5);

    i=0;
    do
    {
        liczba = losuj();

        while (liczba==tablica[0] && liczba==tablica[1] && liczba==tablica[2] && liczba==tablica[3] && liczba==tablica[4])
        {
                liczba = losuj();
        }
        tablica[i] = liczba;
    i++;
    }
    while (i<5);

    i=0;
    do
    {
        cout<< tablica[i] << endl;
        i++;
    }
    while (i<5);
}

 

1 odpowiedź

+1 głos
odpowiedź 9 października 2018 przez criss Mędrzec (172,570 p.)
liczba = losuj();        

while (liczba==tablica[0] && liczba==tablica[1] && liczba==tablica[2] && liczba==tablica[3] && liczba==tablica[4])
        {
                liczba = losuj();
        }

Nie ma sensu porównywać ze wszystkimi liczbami z tablicy podczas losowania np. drugiej liczby. Wystarczy, że porównasz tylko z pierwszą. Przy losowaniu trzeciej porównaj tylko z pierwszą i drugą itd.. I nie pisz takich wielkich warunków. Jakbyś miał tysiąc liczb to byś pisał przez tydzień taki warunek? Albo pisał jakiś skrypcik który zrobi to za ciebie? Od tego są pętle.
Poza tym - mogłeś użyć do..while zamiast jedno losuj() przed pętlą a drugie wewnątrz.

No i sam warunek też jest skopany - tzn. to powinny być alternatywy (operator || ) a nie koniunkcje (operator && ).

komentarz 9 października 2018 przez Gadzic Nowicjusz (170 p.)
Dzięki za podpowiedzi! Warunek oczywiście już działa. Wiem że warunek jest toporny, ale z początku chciałem, żeby działał jakkolwiek, a teraz postaram się go zoptymalizować. Co do porównywania tylko z poprzednimi liczbami to było to dla mnie oczywiste, niestety nie oczywistym dla mnie jest jak to napisać ;) Pozdrawiam!

Podobne pytania

0 głosów
2 odpowiedzi 683 wizyt
pytanie zadane 14 stycznia 2018 w C i C++ przez Maciej3206 Użytkownik (570 p.)
0 głosów
2 odpowiedzi 9,743 wizyt
pytanie zadane 5 września 2017 w C i C++ przez Adampio Początkujący (310 p.)
0 głosów
3 odpowiedzi 1,077 wizyt
pytanie zadane 28 czerwca 2018 w JavaScript przez Tomasz Ozi Orzech Początkujący (300 p.)

93,604 zapytań

142,529 odpowiedzi

322,999 komentarzy

63,093 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

Kursy INF.02 i INF.03
...