Olyat lehet, hogy egy for ciklus random megy végig az tömb elemeken, és nem i++ vagy ++i?
Persze. Lehet.
Példát nem kértél így nem is írok
.
.
.
.
.
.
.
.
amúgy: pl.:
C++ esetén: <vector>
Java esetén: ArrayList / List célszerű
Majd generálsz egy random int számot amire ráeresztesz egy modulust (azaz % maradékos osztást) ami ad egy index-et és kiveszed a listából (eltávolítással 1üt). majd a végére teszed. Továbbá a modulus értékét is csökkented 1-el.
Java példa:
List list = Data.getList(); //20 elemű ArrayList<Integer>
Integer i;
for(int j = 20; j > 0; j--) {
... i = list.remove((new Random().nextInt(50) + 1) % j); // kiveszi, majd eltávolítja, de az lista indexeit eltolja az üres fele, tehát nem lesz "lyuk" az index sorban
... // műveletek
... list.add(i); //ha nem akarod hogy elvesszen, vagy lemented máshova
}
Ezt úgy szokás csinálni, hogy a tömb elemeit összekeverjük, és az összekevert tömböt a hagyományos úton bejárjuk. Ha számít az eredeti sorrend is, nyilván másolatot készítenek róla.
Ha a tömböd egy eleme viszont nagyon nagy helyet foglal el, akkor olyat szokás csinálni, hogy egy tömböt csak indexekkel (amik egész számok) töltünk fel 0-ról indulva. Szóval, ha van egy 5 elemű tömböd, akkor lesz egy másik tömböd is:
int adat[] = { 587, 314, 208, 215, 325 }; //ez csak a példa kedvéért lett int típusú
int index[5];
for (int i = 0; i < 5; i++) indexek[i] = i;
Ezt követően összekeverjük a sokkal kevesebb helyet foglaló indexek tömböt, és valahogy így járjuk be:
for (int i = 0; i < elemek_száma; i++) {
.. //Az éppen kiválasztott elem az adat[index[i]] lesz.
}
Ne végezzünk fölösleges köröket. A tömböt összekeverni, majd hagyományos úton bejárni 2 ciklus. Könnyedén összevonható egybe a folyamat. Random szám generálással kiválasztunk egy elemet a tömb első és utolsó eleme között, a kiválasztott elemmel megcsinálja, amit akar, majd kicseréli az első indexen levővel. Eztán a második és az utolsó index között választ ki egy random számot, és így tova. Miért jó ez?
1. Két ciklus helyett egyben végezzük el a folyamatot
2. Ez egy igen hatékony módja ismétlődésmentes sorsolás implementálásának is. Teszemazt ki akar sorsolni egy állományból 5 nevet, ismétlődés nélkül. Kizárja a lehetőségét, hogy az RNG ugyanazt a nevet köpje ki kétszer, továbbá nem kell az egész tömböt feldolgoznia, elég annyi elemet, ahányat kiválaszt.
"Modern fordító esetében"
Azért törekedjünk már hatékony kódot írni, szerintem :D
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!