Błąd w kodzie do losowania bez powtórzeń

0

Witam,
Mam problem dotyczący losowania. Próbuję napisać kod, w którym liczby nie będą się powtarzały. Niby wszystko jest OK, ale raz kompiluje się poprawnie, a raz po napisaniu ostatniej liczby wyskakuje okienko, że program przestał działać. Czy ktoś mógłby powiedzieć, a raczej napisać, gdzie tkwi szkopuł? Kod ten widnieje poniżej:

#include <iostream>
#include <windows.h>
#include <time.h>
#include <cstdlib>
using namespace std;

// Kompilator: CodeBlocks
// System: Windows 7

int main()
{
srand(time(NULL));

    int ile_pytan = 20;
    int ile_wylosowac = 5;
    int ile_juz_wylosowano=0;
    int *wylosowane = new int[ile_wylosowac+1];
    bool losowanie_ok;

    for (int i=1; i<=ile_wylosowac; i++)
    {
		do
		{
            int liczba=rand()%ile_pytan+1;
            losowanie_ok=true;

			for (int j=1; j<=ile_juz_wylosowano; j++)
			{
				if (liczba==wylosowane[j]) losowanie_ok=false;
			}

			if (losowanie_ok==true)
			{
				ile_juz_wylosowano++;
				wylosowane[ile_juz_wylosowano]=liczba;
			}
		} while(losowanie_ok!=true);
    }
	cout<<"Wylosowane numery: ";
    for (int i=1; i<=ile_wylosowac; i++)
    {
		cout<<wylosowane[i]<<" ";
	}


    return 0;
}
1

Utrudniasz wszystkim życie iterując od 1. Kod wydaje się formalnie poprawny, poza memory leakiem przez new, ale polecam lekturę:

Cały "problem" można by rozwiązać w kilku czytelnych i zwięzłych linijkach:

mt19937 gen{random_device{}()};
vector<int> numbers(20);
iota(numbers.begin(), numbers.end(), 1);
shuffle(numbers.begin(), numbers.end(), gen);
numbers.resize(5);

https://wandbox.org/permlink/EGXpnVjPlmycqmK3

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