losowanie bez powtorzen

0

cześć,
mam problem z programem, który to miałby losować liczby bez powtórzeń. Mój zamysł jest następujący: program losuje pierwszą liczbę, następie wchodzi w pętlę gdzie losuje drugą liczbę i pytany jest, czy nowa liczba jest różna od poprzedniej. Jeżeli tak, to wpisuje ją do tablicy. Jeżeli nie, to rozpoczyna pętlę od nowa i tak aż do uzyskania 5-ciu liczb w tablicy. Na koniec powinien wszystkie liczby wypisać. Problem w tym, że program nie działa ;D za pomoc z góry dziękuję!

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    srand(time(NULL));
    int  losuj, wylosowane[5];
int i = 0;
   wylosowane[0]=(rand()%10)+1;
   do
   {
       int i = 0;
    losuj = (rand()%10)+1;
 if (losuj != wylosowane[i])
    wylosowane[i+1] = losuj;
   }
     while (i<5);

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

    return 0;
}
1

Problem w tym, że program nie działa
Szkoda, że nie potrafisz opisać konkretnie co się dzieje.

Ogółem, jeśli zakres liczb jest niewielki dla komputera to lepiej jest wpakować wszystkie wartości do wektora, wymieszać go, a potem po prostu wziąć kilka pierwszych elementów.

Np. dziesięć losowych liczb z zakresu [101,150] bez powtórzeń:

	vector<int> vec(50);
	iota(vec.begin(), vec.end(), 101);
	shuffle(vec.begin(), vec.end(), std::random_device{});
	vector<int> bez_powtorzen(vec.begin(), vec.begin() + 10);

http://melpon.org/wandbox/permlink/VfwHtgaXtjk6TNd7

Odnośnie Twojego kodu:

  1. formatowanie. Polecam http://format.krzaq.cc
  2. Używasz rand, używaj #include <random>
  3. int i = 0; definiujesz nową zmienną wewnątrz pętli. Jej zmiana nie ma wpływu na wartość poza pętlą lub nawet w jej warunku.
1
  1. http://format.krzaq.cc/ style file, bo tego nie da się czytać.
  2. W pierwszej pętli nie masz ++i.
  3. Algorytm jest błędny, bo dla każdej nowej liczby musisz sprawdzić czy ona jest różna od wszystkich już wylosowanych, a nie tylko od ostatnio wylosowanej. Teoretycznie to może trwać do końca świata (jak masz pecha i ciągle wylosujesz liczbę, która już istnieje).
  4. Ogólnie ten problem się rozwiązuje w ten sposób, że wpisujesz 10 liczb do tablicy, losowo przemieszasz (http://en.cppreference.com/w/cpp/algorithm/random_shuffle) i bierzesz 5 pierwszych.
0

kq, wystarczy, że użyłem <cstdlib> ;) niestety nie znam jeszcze wektorów, dlatego chciałem to zadanie rozwiązać w oparciu o if'y i pętle

twonek, rzeczywiście, algorytm jest bez sensu. Pisanie programów będąc zmęczonym nie jest dobrym pomysłem

W każdym razie dzięki za pomoc, jutro usiądę do tego i przeanalizuję raz jeszcze.

0

Jeśli ograniczenie jest na to, że masz mieć jedną z 10 liczb, to łatwiej ułożyć tablicę od 1 do 10 i wylosować kolejność ich ustawienia. będzie to działało szybciej i trudniej zrobić błąd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1