Forum » Programiranje » Generiranje naključnih števil ne upošteva pogojev
Generiranje naključnih števil ne upošteva pogojev

nejodagreat ::
S sledečo kodo
želim naključno generirati števila, ki ne smejo biti deljiva s 50 ali 49 (+ še en pogoj, ki mislim da pri tem nima vloge). Vseeno vsaj enkrat v 100 izvedbah while zanke dobim kakšno število, ki temu ne ustreza.
En izpis dobljenih števil:
Kaj delam narobe oziroma kako bi to rešil?
while(form[loc] != ' ' && loc % 50 != 0 && ((loc-(loc/50)) % 49) != 0); { loc = rand()%2000 + 1; //od tu naprej je za test... cout << loc; if(form[loc] == ' ' && loc % 50 == 0 && ((loc-(loc/50)) % 49) == 0) cout<<"!!!!!!!!!!!"; cout<<endl; }
želim naključno generirati števila, ki ne smejo biti deljiva s 50 ali 49 (+ še en pogoj, ki mislim da pri tem nima vloge). Vseeno vsaj enkrat v 100 izvedbah while zanke dobim kakšno število, ki temu ne ustreza.
En izpis dobljenih števil:
1402
1281
1459
1079
431
1037
1572
1510
238
1774
1450!!!!!!!!!!!
1940
871
1156
1822
1235
330
100!!!!!!!!!!!
981
1141
1416
1528
1328
1370
665
454
497
1530
1475
383
1712
621
1193
1226
1629
1315
1074
592
134
785
1628
1849
1755
425
1808
1719
1472
1902
104
1424
1027
1862
1822
770
1598
1216
1095
226
191
1479
1120
438
1431
72
567
1588
1968
1
573
1578
563
1515
1323
528
1832
1290
355
570
1502
1074
1272
1059
46
1788
1601
758
1036
1481
1881
1310
477
214
411
1537
1279
1649
1724
265
981
1658
Kaj delam narobe oziroma kako bi to rešil?
- spremenil: nejodagreat ()

shadeX ::
Mogoče tole ne bo ravno optimalna rešitev zate, ampak kaj pa če bi recimo v tvojo kodo dodal "continue". Se pravi nekako, ko pride do števila ki je deljiva s 50 ali 49, namesto da ga shraniš v array, ga preskočiš "continue".

Wrop ::
Če hočeš preveriti ali je število deljivo s 50 ali z 49 potem narediš tako :
loc % 49 == 0 || loc % 50 == 0
Ti pa napačno preverjaš deljivost z 49.
loc % 49 == 0 || loc % 50 == 0
Ti pa napačno preverjaš deljivost z 49.

one too many ::
@MUC: kako ima +1 kaj veze? Saj to samo prestavi interval z [0,1999] na [1,2000].
@nejodagreat:
A ne bi hotel imeti indeksov z intervala [0,1999]?
Kaj dela podpičje takoj za while?
@wrop: Ja, ampak to ne bi smelo imeti vpliva. Takoj ko je loc%50 == 0, ne bi smelo iti v naslednjo zanko.
@nejodagreat:
A ne bi hotel imeti indeksov z intervala [0,1999]?
Kaj dela podpičje takoj za while?
@wrop: Ja, ampak to ne bi smelo imeti vpliva. Takoj ko je loc%50 == 0, ne bi smelo iti v naslednjo zanko.

joze67 ::
/me seriously confused.
Najprej: je izsek sploh sintaktično pravilen (# oklepajev v pogoju while).
Potem: podpičje za pogojem while zanesljivo ne sodi tja, četudi je sintaktično ok.
In nazadnje, zakaj oz. kako naj bi to generiralo števila z željeno lastnostjo?
Najprej: je izsek sploh sintaktično pravilen (# oklepajev v pogoju while).
Potem: podpičje za pogojem while zanesljivo ne sodi tja, četudi je sintaktično ok.
In nazadnje, zakaj oz. kako naj bi to generiralo števila z željeno lastnostjo?

nejodagreat ::
Se opravičujem, par stvari je res napačnih, nekaj sem zasral ko sem kopiral kodo in jo vmes spreminjal. V glavnem, ta je pravilna in izpiše podoben rezultat kot sem ga dal zgoraj.
Pa narobe sem se izrazil - preverjam deljivost s 50 in s 50n + 49 (z n je mišljen večkratnik, ne spremenljivka z imenom n).
Drugače pa poskušam v konzolo "narisat" teren dimenzij 40x50, kjer je vsak 50-ti in (50n + 49)-ti element koordinata na robu, z naključno dobljenim številom pa predstavim neko drugo koordinato, ki pa ne sme biti na robu. Princip ki ga imam v glavi je pa "generiraj random število, če ne ustreza pogojem generirajo novo, dokler ne dobiš ustreznega".
while(form[loc] != ' ' && loc % 50 != 0 && (loc-(loc/50)) % 49 != 0) { loc = rand()%2000 + 1; //od tu naprej je za test... cout << loc; if(form[loc] == ' ' && loc % 50 == 0 && (loc-(loc/50)) % 49 == 0) cout<<"!!!!!!!!!!!"; cout<<endl; }
Pa narobe sem se izrazil - preverjam deljivost s 50 in s 50n + 49 (z n je mišljen večkratnik, ne spremenljivka z imenom n).
Drugače pa poskušam v konzolo "narisat" teren dimenzij 40x50, kjer je vsak 50-ti in (50n + 49)-ti element koordinata na robu, z naključno dobljenim številom pa predstavim neko drugo koordinato, ki pa ne sme biti na robu. Princip ki ga imam v glavi je pa "generiraj random število, če ne ustreza pogojem generirajo novo, dokler ne dobiš ustreznega".
Zgodovina sprememb…
- spremenil: nejodagreat ()

technolog ::
Podpičje maš na konc prve vrste, dej ga stran in bo delovalo.
Tale ta druga koda se pa tud ne prevede, en zaklepaj premalo imaš v 6. vrsti. Po moje rešiš zadevo tako, da zamenjaš stavek z do-while:
Tale ta druga koda se pa tud ne prevede, en zaklepaj premalo imaš v 6. vrsti. Po moje rešiš zadevo tako, da zamenjaš stavek z do-while:
do { loc = rand()%2000 + 1; cout << loc; cout<<endl; } while (form[loc] == ' ' && loc % 50 != 0 && (loc-(loc/50)) % 49 != 0);
Zgodovina sprememb…
- spremenil: technolog ()

nejodagreat ::
Sem popravil še to 6. vrstico. Sicer pa koda se mi prevede in izpisuje večinoma ok števila, približno na vsakih 100 pa pride ena neustrezna, kot sem dal primer v prvem postu.

nejodagreat ::
Fak nikakor mi ne uspe prav povedat. Število ki ga dobim, ne sme biti 50n + 49 in ne sme biti deljivo s 50.

arjan_t ::
In kako naj ta enacba deluje?
imas x = 149
izracunas n = 149/50 = 2
in potem primerjas (149 - 2) % 49
to napises preprosto tako:
imas x = 149
izracunas n = 149/50 = 2
in potem primerjas (149 - 2) % 49
to napises preprosto tako:
loc % 50 != 49

technolog ::
nejodagreat je izjavil:
Fak nikakor mi ne uspe prav povedat. Število ki ga dobim, ne sme biti 50n + 49 in ne sme biti deljivo s 50.
to pomeni pogoj:
loc % 50 != 49

nejodagreat ::
Ok, hvala za ta popravek, ne vem zakaj sem kompliciral s tem.
Vseeno, dobivam še vedno številke, ki jih ne bi smel (označene s klicaji):
Vseeno, dobivam še vedno številke, ki jih ne bi smel (označene s klicaji):
1302
188
1087
1890
1297
306
440
1624
1248
1742
142
787
312
473
666
551
1761
1315
473
112
1586
877
411
1438
430
728
538
1811
1982
365
1244
1033
289
254
762
841
1409
525
18
122
56
827
314
1975
915
931
1862
1285
1318
1417
955
979
1104
1117
437
1826
32
1125
1846
1911
120
1866
1136
814
210
753
1749!!!
497
1952
908
909
810
231
786
792
1781
447
1181
1188
330
1492
1458
401
1226
1969
1175
1299!!!
1927
1214
160
1416
393
1143
154
1883
1454
48
923
1288
1330
Zgodovina sprememb…
- spremenil: nejodagreat ()

Spura ::
Saj nimas nobene zascite proti takim stevilom! Razlozi, zakaj naj ne bi takega stevila dobil ob taki kodi.
To ti zagotavlja, da stevilo ni deljivo s 50, ni 50*x + 49, in da je vrednost v arrayu form na tej poziciji presledek (predvidevam, da si to zelis, ker najbrz zelis dodajat na prazna mesta, ceprov v tvoji kodi je to lih kontra. Tko da mozno da sm tale form[loc] != ' ' zajebu.
do { loc = rand()%2000 + 1; } while(form[loc] != ' ' || loc % 50 == 0 || loc % 50 == 49);
To ti zagotavlja, da stevilo ni deljivo s 50, ni 50*x + 49, in da je vrednost v arrayu form na tej poziciji presledek (predvidevam, da si to zelis, ker najbrz zelis dodajat na prazna mesta, ceprov v tvoji kodi je to lih kontra. Tko da mozno da sm tale form[loc] != ' ' zajebu.
Zgodovina sprememb…
- spremenil: Spura ()

mojca ::
Tvoja koda je ekvivalent temu:
Namesto tega lahko uporabiš tole:
ali npr.
while(!stopil_sem_v_blato(zadnji_korak)) { zadnji_korak = pogumno_naredi_naslednji_korak(); // in po možnosti stopi v blato cout << zadnji_korak; if(stopil_sem_v_blato(zadnji_korak)) // dve vrstici pred tem (zunanja zanka preveri za prejšnji korak in te ne obvaruje) cout<<"IMAM ZASVINJANE ČEVLJE!!!!!"; cout<<endl; }
Namesto tega lahko uporabiš tole:
while(true) { zadnji_korak = preveri_naslednji_korak(); if(!stopil_bi_v_blato(zadnji_korak)) { cout << zadnji_korak << endl; // ta korak je varen } }
ali npr.
zadnji_korak = preveri_naslednji_korak(); for(int i=0; i<100; i++) { while(stopil_bi_v_blato(zadnji_korak)) zadnji_korak = preveri_naslednji_korak(); cout << zadnji_korak << endl; // ta korak je varen }
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [SQL] počasna poizvedbaOddelek: Programiranje | 1555 (1365) | AndyS |
» | Nujna Pomoč ! C++Oddelek: Programiranje | 1249 (1048) | BigWhale |
» | Skeniranje BMP ce vsebuje SubSlikoOddelek: Programiranje | 1402 (1295) | MTm2H37rqt7B |
» | ftp ne dela za linux routerjem (ubuntu+shorewall)Oddelek: Omrežja in internet | 1238 (1104) | Bug |
» | Nec 3520a in regijaOddelek: Strojna oprema | 1204 (1105) | Quikee |