Problem oko generisanja pseudoslucajnih brojeva

Problem oko generisanja pseudoslucajnih brojeva

offline
  • Més que un club
  • Glavni vokal @ Harpun
  • Pridružio: 27 Feb 2009
  • Poruke: 3898
  • Gde živiš: Novi Sad,Klisa

Napisano: 10 Jun 2013 16:35

Pravim sad neku igru, i treba da generisem pseudoslucajne brojeve tako da mi se brojevi u nizu ne smeju ponavljati i moraju biti poredjani u rastucem redosledu.


napravio sam funkciju koja to sve regulise.
U samom mainu sam stavio srand(time(NULL));

void numDif(std::vector<struct krug>&a, int n) {    for(int i = 0; i <n;i++)    {       for(int j = i + 1; j < n;j++)       {          if(a[i].broj >= a[j].broj)          {             while(a[i].broj >= a[j].broj)                a[j].broj = rand() % 100;          }       }    } }

problem je u tome sto program upadne u beskonacnu while petlju, i to kada je i-ti element jednak sa j-tim elementom. Kako resiti ovaj problem?

Dopuna: 10 Jun 2013 20:47

Nasao sam resenje. Ta moja funkcija nista ne valja Very Happy
Napisao sam novu, kod koje mi nece trebati taj while ciklus, a brojevi ce biti savrseno rasporedjeni, bez ponavljanja, koristio sam funkcije random_shuffle i sort za realizaciju. Smile

void Brojevi(std::vector<struct krug> &a, int n) {    std::vector<int> pom;    for(int i = 0; i < 50; i++) pom.push_back(i);    std::random_shuffle(pom.begin(), pom.end());    std::sort(pom.begin(), pom.begin() + n);    for(int i = 0; i < n; i++)       a[i].broj = pom[i]; }



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Imam par predloga, mislim nista mnogo bitno cisto informativno ako dosad nisi video.
1.
Umesto ovoga (posto brojevi idu sekvencijalno):
std::vector<int> pom; for(int i = 0; i < 50; i++) pom.push_back(i);
mozes da iskoristis iota algo:
std::vector<int> pom(50); std::iota(std::begin(pom), std::end(pom), 0);

2.
Posto se zna koliki je broj elemenata, zadas vektoru koliko ce da alocira u konstruktoru odjednom umesto push_back-a koji resize-uje vise puta, odnosno poziva new u alokatoru sto moze da bude relativno skupo u zavisnosti od primene.

3.
Primer sa mersenne twister random funkcijom i prosledjivanjem predicate funkcija u shuffle i sort:
void Brojevi(std::vector<krug> &a) {    static const std::size_t max_elems = 50;    assert( max_elems >= a.size() );    static std::mt19937 mt(static_cast<unsigned int>(std::time(nullptr)));    std::uniform_int_distribution<int> tint(0, max_elems - 1);    std::function<int(int)> shuff_fun     = [&](int dummy) { return tint(mt); };    std::function<bool(int,int)> sort_fun = [](int x, int y) { return x < y; };    std::vector<int> pom(max_elems);    std::iota(std::begin(pom), std::end(pom), 0);    std::random_shuffle(std::begin(pom), std::end(pom), shuff_fun);    std::sort(std::begin(pom), std::begin(pom) + a.size(), sort_fun);    for(std::size_t i = 0; i < a.size(); i++)       a[i].broj = pom[i]; }

Ne treba ti n parametar posto vektor krugova "zna" svoju velicinu.



Ko je trenutno na forumu
 

Ukupno su 768 korisnika na forumu :: 4 registrovanih, 0 sakrivenih i 764 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: bojank, Koridor, Litostroton, nemkea71