@Ivan
Ok. Mada mislim da je kod ocigledan.
Dosadile mi srand i rand funkcije, a rek'o i da probam ovaj Mersenne Twister generator pa sam to lepo spakovao u klasu.
Klasa ima templejt metodu
get overload-ovanu da bih u zavisnosti od tipa argumenata koristio odgovarajuce "distribucije".
Znaci samo integral i floating-point tipovi dolaze u obzir sve ostalo je compile time error.
http://en.cppreference.com/w/cpp/num...t_distribution
Kod:
typedef std::pair<std::size_t, std::size_t> tpnum;
std::vector<tpnum> numbers;
Imam vektor parova gde prvi element (first) oznacava koliko puta se ponovio neki broj i drugi element (second) oznacava sam taj broj.
Kod:
numbers.resize(N);
std::for_each(std::begin(numbers), std::end(numbers), [](tpnum& e){
e = std::make_pair(0u, random::get(0u, 100u));
});
Prosirujem vektor na velicinu N (koliko brojeva se izvlaci) i inicijalizujem ga. first = 0, second = random 0 - 100.
Kod:
for(auto& it : numbers)
{
it.first = std::count_if(std::begin(numbers), std::end(numbers), [&it](const tpnum& e){
return it.second == e.second;
});
}
Broji koliko se koji element ponavlja (tu su i "duplikati") i cuvam tu vrednost za svaki.
Kod:
std::sort(std::begin(numbers), std::end(numbers), [](const tpnum& l, const tpnum& r){
return l.second > r.second;
});
Soriram po random brojevima koji su izvuceni da bih u sledecem koraku imao vektor spreman za unique-ifikaciju (
std::unique).
Kod:
auto end = std::unique(std::begin(numbers), std::end(numbers), [](const tpnum& l, const tpnum& r){
return l.second == r.second;
});
Pozivam std::unique algo i cuvam end iterator da bih znao gde je kraj unikatima.
Kod:
std::sort(std::begin(numbers), end, [](const tpnum& l, const tpnum& r){
return l.first > r.first;
});
Sortiram ponovo da bih dobio elemente koje se najvise ponavljaju prvo. Od pocetka do elementa gde pokazuje end iterator.
I na kraju ispisujem prvih F elemenata. Mada moze da se desi da broj unikata bude manji od F-a ali nece fejlovati.