Egy n elemű tömbnek elemeit hogy tudom véletlenszerűen összekavarni? Milyen algoritmussal?
Válaszokat előre is köszönöm.
<A tömb elemei véletlenszerű sorrendben legyenek a tömbben.>
Ha nem kell, hogy tényleg véletlenszerű legyen a keverés, akkor csinálhatod úgy is, ahogy az első javasolta.
De ha tényleg véletlenszerűt akarsz, akkor használd a Fisher—Yates keverést.
Miért? Itt a válasz:
"egy 3 kártyából álló pakli esetén 27 variáció (33 = 3 x 3 x 3 = 27) jöhet ki a kártyák sorrendjére"
Ez mi akar lenni?
@22:43
Én úgy értelmezem, hogy a fentebbi keverőciklusnak 27 lehetséges variációja van ahogy lefuthat.
Mi a bajotok a válaszommal?
Ha n=3 akkor az for (int i = 0; i < cards.Length; i++) { int n = rand.Next(cards.Length); Swap(ref cards[i], ref cards[n]); }
Ciklusnak 27 azaz 3^3 lehetséges állapot közül választ ki egyet. Mivel minden iterációban 3 féle érték közül választ ki egyet a generátor egyenlő valószínűséggel ha az egyenletességi hipotézisnek megfelelően generál random-ot. Ez a 3^3 állapot fog leképeződni 3 faktoriális = 6 féle lehetséges keverés végkimenetre. Bizonyos permutációknak nagyobb esélye van míg egyes keveréseknek kevesebb.
Ha a
for (int i = cards.Length - 1; i > 0; i--)
{
int n = rand.Next(i + 1);
Swap(ref cards[i], ref cards[n]);
}
Keveréssel csináljuk akkor n=3-ra 3 faktoriális lehetséges állapot közül fut le a ciklus, ha jó a randomgenerátor akkor minden lehetséges permutációnak egyenlő esélye van.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!