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 1050 korisnika na forumu :: 77 registrovanih, 13 sakrivenih i 960 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: Arsenije, Asparagus, babaroga, bbrasnjo3, Bickoooo, bobomicek, bokisha253, boxbole, Chainsaw, Ciri1994, crnirocko, Darth Malak, deLacy, Donneraj, DrSidious, dukajov, Dzigy, eagle.rs, ele, Flashburn, Futurama, gagidjuric, Georgius, Gerilac, gobrad, Hitri, HogarStrashni, KAIS, Kobrim, kolle.the.kid, Kruger, Litostroton, Lucije Kvint, mat, Mi lao shu, Mickey12345, mikrimaus, milos.cbr, milos97, milutin134, mir, mnn2, monomah, N95, nelezele, ObicanUser, OREMUS, Pero, Pilence, PlayerOne, procesor, RajkoB, rakivan, sap, Shadow soldier, Smajser, sokars, sony771, srbijaiznadsvega, tacija, tamno.nebo, TGKastela, tooljan, vaso1, vathra, veljkovicdani, Viktor Petrenko, Vlado82, Vzor50, wizzardone, Yellow Pinky, YU-UKI, zokabl, zombicar153, šumar bk2, Đurđevdan, 79693