Kezdőoldal » Számítástechnika » Programozás » Olyat lehet, hogy egy for...

Olyat lehet, hogy egy for ciklus random megy végig az tömb elemeken, és nem i++ vagy ++i?

Figyelt kérdés
mondjuk c-ben.
2016. aug. 25. 19:27
 1/6 anonim ***** válasza:

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

}

2016. aug. 25. 20:09
Hasznos számodra ez a válasz?
 2/6 anonim ***** válasza:
88%

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.

}

2016. aug. 25. 20:15
Hasznos számodra ez a válasz?
 3/6 anonim ***** válasza:
Mindent lehet.
2016. aug. 25. 20:30
Hasznos számodra ez a válasz?
 4/6 anonim ***** válasza:

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.

2016. aug. 26. 04:12
Hasznos számodra ez a válasz?
 5/6 anonim ***** válasza:
Modern fordító esetén az egész összekeverésénél mindegy, ugyan olyan hatékony lesz mindkettő.
2016. aug. 26. 15:36
Hasznos számodra ez a válasz?
 6/6 anonim ***** válasza:

"Modern fordító esetében"

Azért törekedjünk már hatékony kódot írni, szerintem :D

2016. aug. 26. 15:39
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!