C# ismétlődés probléma?
eltárolod az előzőt, és ha nem ugyanaz, akkor az előző változóra beállítod az újat, ha ugyanaz, akkor pedig újragenerálod.
Egy egyszerű if-else páros kell hozzá
Tudnál rá mutatni egy konkrét példát? Utána néztem, de sajnos mindig nem sikerül. Magát a feltöltés részét nem értem.
Random rnd = new Random();
int szam = rnd.Next(0, 4);
int[] tarol = new int[2];
var szamok = new List<int>();
Random rnd = new Random();
int szam = rnd.Next(0, 4);
szamok.Add(szam);
for (int i = 0; i < 100; i++) // vagy amenynit akarsz
{
int uj = rnd.Next(0, 3);
if (uj >= szam)
{
uj++;
}
szam = uj;
szamok.Add(szam);
}
#1 Ezzel a megközelítéssel az egyetlen baj a potenciális ismétlődés, bár jóformán 0 a valószínűsége, de akár végtelen ciklusba is kerülhet, ha mindig ugyanazt a számot generálja ki. (Kivéve, hogy ezek a randomgenerátorok törekednek az uniform eloszlásra, de na).
#3 megoldása például működik, garantáltan lineáris, és a generált számok eloszlása egyenletes. Igazából én is hasonlót képzeltem el ehhez.
Az én megközelítésem a következő:
1. lépés : Kigenerálsz egy random számot 0-4 között. Ezt eltárolod egy változóba, plusz ha tárolni is akarod a kigenerált számaidat, egy megfelelőlóba (tömb, vagy akármi).
2. Ezután ciklusban generálsz 0-3 között számokat (nem 0-4 között!), a kapott számot eggyel növeled, majd hozzáadod a fent említett változó értékéhez, és veszed az 5-ös modulóját. A mod 5 miatt az eltolás ciklikusan történik, és garantáltan 0-4 közötti értéket kapsz. Valamint, mivel a kigenerált szám 1-el megnövelt értéke maximum 4 lesz, így az előző értékhez hozzáadva biztos, hogy azt az értéket nem kapod vissza (5-öt kéne hozzáadni, hogy modulo 5-el ugyanazt az értéket kapd), viszont minden más érték azonos eséllyel fordulhat elő.
Szemléltető kód:
int N = 25 \\hány számot generáljunk összesen
Random rnd = new Random();
int currentNumber = rnd.Next(0, 4);
List<int> numbers = new List<int>();
szamok.Add(currentNumber);
for (int i = 0; i < N-1; i++)
{
        int innerNumber = rnd.Next(0, 3);
        currentNumber = (currentNumber + inenrNumber +1) %5;
        numbers.Add(currentNumber);
}
szamok.Add(currentNumber) == numbers.Add(currentNumber)
Látszik, hogy jó lusta programozó lévén lemásoltam ami kódot kellett. :D
"#1 Ezzel a megközelítéssel az egyetlen baj a potenciális ismétlődés, bár jóformán 0 a valószínűsége, de akár végtelen ciklusba is kerülhet, ha mindig ugyanazt a számot generálja ki."
Hát ez nem talált, mert ha ez történne ezzel azt bizonyítanánk, hogy az algoritmusunk nem véletlen számot generál, hanem konstanst. Nem generálhatja mindíg ugyanazt számot.
Hali! Köszi szépen a segítségeket. Bocsi, de elírtam. A számnak 1-3 között kell lennie (mármint 1, 2, vagy 3).
Ez a kód egy függvényben van, ezért timer miatt ismétlődik megadott ideig (ezért kell 1 szám, majd timer után lefut).
Mindkettő kódot kipróbáltam. A probléma, hogy sajnos mindkettőnél van ismétlés.
1.
var szamok = new List<int>();
Random rnd = new Random();
int szam = rnd.Next(0, 4);
szamok.Add(szam);
for (int i = 0; i < 1; i++) // vagy amenynit akarsz
{
int uj = rnd.Next(0, 3);
if (uj >= szam)
{
uj++;
}
szam = uj;
szamok.Add(szam);
}
textBox1.Text = textBox1.Text + szam;
2.
int N = 1; //hány számot generáljunk összesen
Random rnd = new Random();
int currentNumber = rnd.Next(1, 3);
List<int> numbers = new List<int>();
numbers.Add(currentNumber);
for (int i = 0; i < N - 1; i++)
{
int innerNumber = rnd.Next(1, 2);
currentNumber = (currentNumber + innerNumber + 1) % 5;
numbers.Add(currentNumber);
}
textBox1.Text = textBox1.Text + currentNumber;
Valószínűleg én rontottam el valamit, vagy nem közöltem elég infót hozzá. :(
#6 Igen, tisztában vagyok vele, hogy a random számgenerátorok többé-kevésbé egyenletes eloszlással generálnak, de
1. Szerintem nem kéne feltételezni, hogy egy általad ismeretlen, függetlenül megvalósított algoritmus az elvárásaidnak megfelelően fog működni.
2. Ha ennél a problémánál nem is feltétlenül probléma, az újragenerálgatás mindig rossz praktika, és nem ezt kéne megerősíteni egy tanuló fejében. Ha nem csak egy, hanem mondjuk 100 különböző számot kell kizárni a random generálásból, akkor már benne van a pakliba, hogy jópárszor iterál. Ezért kellene olyan megoldásra törekedni, ami lehetőleg lineáris, vagy akár konstans futási idejű.
És ha nem textbox-al iratom ki?
MessageBox.Show(currentNumber.ToString());
Ebben az esetben sem működik.
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!