Losowanie bez powtórzeń

0

Witam mam problem z kodem w języku c++.
Planowałem napisać dosyć prosty kod mający na celu weryfikacje losowanych liczb, aby losowanie odbywało się bez powtórzeń, jednak pomimo wielu prób i poprawek nie jestem w stanie dojść do powodu nieprawidłowego działania kodu. Losowanie zwyczajnie odbywa się z powtórkami. Kod wygląda następująco:

 int suma=0;
   int wynik2[ile];
   if(powtorka==2)
   {
        for(int j=0; j<ile; j++)
        {
            wynik2[j]= calkowite(ood,doo);
            int i=j;
            while(i>0)
            {
                while(wynik2[j]==wynik2[i-1])
                {
                    wynik2[j]=calkowite(ood,doo);
                }
                i--;
           }
       }
    }
for(int j=0; j<ile; j++)
      ` {
            cout<< wynik2[j]<< " \a";
           Sleep(1000);
            suma+=wynik2[j];
       }
        cout<<endl<<"Suma: "<<suma<< "\a"; 

gdzie zmienna:
ile- liczba wszystkich losowanych liczb
powtorka- zwyczajna zmienna odpowiedzialna za decyzje odnośnie obecności "powtórek" w kodzie
calkowite(ood,doo)- funkcja losująca liczby całkowite w konkretnym przedziale
wynik2[]- tablica z wylosowanymi liczbami

Dolna pętla służy jedynie do liczenia sumy liczb, oraz wypisywania daych na ekran, nie sądze by była ona istotna w tym wątku ale dla pewności wolałem i ją tutaj umieścić. Jest to kod wewnątrz mej własnej funkcji do której wprowadziłem potrzebne dane. Problem, o którym już wyżej wspomniałem to zwyczajnie losowanie z powtórzeniami nawet w przypadku gdy powinno odbywać się bez nich. Bardzo proszę o pomoc, męczę się z tym kodem już kilka dni i skończyły mi się pomysły. W załączniku dodaję cały program, domyślam się, że spojrzenie z perspektywy całego programu jest znacznie prostsze. Z góry bardzo wszystkim dziękuję za poświęcony czas!

2

To można zrobić w kilku linijkach:

Np.:

    vector<int> lotto(49);
    iota(lotto.begin(), lotto.end(), 1);
    mt19937 random{random_device{}()};
 
    shuffle(lotto.begin(), lotto.end(), random);
    copy_n(lotto.begin(), 6, ostream_iterator<int>(cout, ", "));

W Twoim kodzie problemem jest to, że po ponownym losowaniu nie sprawdzasz wszystkich liczb, tylko jedziesz ze sprawdzaniem dalej. Ale kod jest mega nieczytelny, nie robiłbym tego tak. Ewentualnie:

unordered_set<int> selected;
uniform_int_distribution dis(0, 1000000000);
while(selected.size() < 100)
    selected.insert(dis(random));

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.