Losowanie bez powtarzania.

0

Witam. Chcę wylosować 5 liczb bez powtarzania, coś jest jednak nie tak i program zatrzymuje się na pętli while. Czy mógł by mi ktoś wytłumaczyć dlaczego ten program nie działa
?

int main() {
	
vector <int> v;
int losowana;

srand(time(NULL));
losowana = rand() % 10;
v.push_back(losowana); 

while(v.size() != 5) {
			   
				losowana = rand() % 10;
				for (int i = 0; i < v.size(); i++) {
					
					if (losowana != v[i]) {
					   			 v.push_back(losowana);
								 }
					}				
				}
				
for (int i = 0; i < v.size(); i++) {           // wyświetlanie wektora
cout << i + 1 << ". " << v[i];
}

getch();
return 0;
	
	
} 
0

Użyj debuggera i prześledź, co ten program tak naprawdę robi, bo o ile nie pogubiłem się w formatowaniu w stylu rzuć-kostką-i-naciśnij-tabulator, to masz błędnie zaprojektowany if.

0

sorki ;p zły trop

0

program kręci się w kółko ponieważ nie dodajesz żadnego elementu, problem związany z tym tkwi w warunku pętli for -> i jest równe 0, tak samo jak wektor więc warunek przerwania pętli jest spełniony.

0
struct next {
    unsigned curr;
    next() : curr(0) {}
    unsigned operator () () { return curr++; }
};

void RandGenerate(std::vector<unsigned> &ret, unsigned range, unsigned count)
{
    ret.clear();
    std::generate_n(std::back_inserter(ret), range, next());
    std::random_shuffle(ret.begin(), ret.end());
    ret.resize(count);
}

    /* ... */
    std::vector<unsigned> v;
    RandGenerate(v, 10, 5);
    /* ... */
0
for (int i = 0; i < v.size(); i++) {
        if (losowana != v[i]) {
            v.push_back(losowana);
        }
    }                                
}

Zastanów sie. W tym wypadku dodajesz wielokrotnie te sama liczbe, w praktyce nigdy nie dodasz dokladnie 5 - z reguly (dla zawsze roznych losowanych liczb) v bedzie mial dlugosci w kolejnych przebiegach: 1, 2, 4, 8…

0

Może lepiej tak?

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
  {
   srand(time(0));
   vector<int> v(10);
   for(size_t i=0;i<v.size();++i) v[i]=i;
   for(size_t i=v.size();i>1;--i) swap(v[i-1],v[rand()%i]);
   v.resize(5);
   for(size_t i=0;i<v.size();++i) cout<<(i+1)<<". "<<v[i]<<endl;
   cin.sync(); cin.get();
   return 0; 
  }

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