Zasada jest taka - załóżmy, że masz dwie liczby do wylosowania - każda z nich musi być inna. Pierwszą losujesz bez żadnego sprawdzania, bo nie mogła być powtórzona. Następnie losujesz drugą - musisz sprawdzić, czy już nie została wcześniej wylosowana, czyli sprawdzasz czy b == a (b to nasza druga liczba, a to pierwsza). Jeśli tak to musimy powtórzyć losowanie bo nie możemy mieć takiej liczby. Potem znowu sprawdzamy czy już wcześniej została wylosowana i tak w kółko, aż dostaniemy nie wylosowaną wcześniej liczbę. Teraz pomyśl - wiesz jak zrobić to dla dwóch liczb, więc jak to zrobić dla N liczb? Tworzysz tablicę o rozmiarze N. Musisz wylosować każdą liczbę z kolei więc oczywistym jest użycie pętli, najbardziej nada się tutaj pętla for. Najpierw kod, potem wytłumaczenie:
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
srand(time(nullptr));
int wylosowane[10] = {}; // Nowa tablica 10 elementowa
for(int i = 0; i < 10; i++) // Dla kazdego elementu tablicy
{
wylosowane[i] = rand()%30; // zalozmy, ze losujemy z puli 30 liczb - 0 do 29
bool powtorzona = false;
for(int j = 0; j < i; j++)
{
if(wylosowane[j] == wylosowane[i])
{
powtorzona = true;
break;
}
}
if(powtorzona)
i--;
}
for(int i = 0; i < 10; i++)
std::cout << wylosowane[i] << " ";
return 0;
}
To co tutaj zrobiliśmy, to stworzylismy 10 elementową tablicę. Następnie po kolei losujemy każdy element tablicy. Kiedy już to zrobimy, musimy sprawdzić czy żaden poprzedni element przypadkiem nie ma tej samej wartości, dlatego sprawdzamy tylko indeksy od 0 do i-1 (i-1 bo nie sprawdzamy aktualnego). Jeśli niestety już taka liczba została wylosowana to za pomocą zmiennej "powtorzona" wykonamy odpowiednia akcje (fragment z "i--").
Jeśli liczba została powtórzona to musimy jakby zapobiec przejściu pętli for do następnego elementu tablicy, czyli zmniejszamy indeks o jeden element, potem jednak pętla jak na końcu każdego obiegu zwiększa zmienną 'i' o jeden więc zostajemy w tym samym miejscu.
Skoro wiesz teraz jak wylosować N liczb, które się nie powtarzają to łatwo możesz to przenieść na zespoły do ligi mistrzów. Załóżmy, że mamy drużyny od 0 do 7 - losujemy całą 8 elementową tablicę. Indeks 0 walczy z indeksem 1, indeks 2 walczy z indeksem 3 itd.
Mając wylosowane indeksy mamy prawie całość za sobą. Wystarczy teraz tylko z jakiejś tablicy/kontenera wyciągnąć nazwę zespołu i voila:
std::string zespoly[30] =
{
"Zespol A", "Zespol B", "Zespol C", "Zespol D" // itd...
};
Oczywiście 30 zespołów to dużo, sam wybierz ile ich chcesz mieć.