Kezdőoldal » Számítástechnika » Programozás » C# ismétlődés probléma?

C# ismétlődés probléma?

Figyelt kérdés
Készítek egy számot véletlenszerűen 0-4 között. Hogyan érhetem el, hogy közvetlen egymás után ne legyen ismétlődés?

2016. dec. 22. 19:48
1 2
 1/16 anonim ***** válasza:

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á

2016. dec. 22. 20:00
Hasznos számodra ez a válasz?
 2/16 A kérdező kommentje:

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];

2016. dec. 22. 20:34
 3/16 anonim ***** válasza:

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);

}

2016. dec. 22. 20:50
Hasznos számodra ez a válasz?
 4/16 anonim ***** válasza:

#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);

}

2016. dec. 22. 22:15
Hasznos számodra ez a válasz?
 5/16 anonim ***** válasza:

szamok.Add(currentNumber) == numbers.Add(currentNumber)


Látszik, hogy jó lusta programozó lévén lemásoltam ami kódot kellett. :D

2016. dec. 22. 22:17
Hasznos számodra ez a válasz?
 6/16 anonim ***** válasza:

"#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.

2016. dec. 23. 08:02
Hasznos számodra ez a válasz?
 7/16 A kérdező kommentje:

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á. :(

2016. dec. 23. 10:15
 8/16 SimkoL ***** válasza:
A textBox1.Text utolsó karakterét kell vizsgálni akkor a következő szám generálásakor.
2016. dec. 23. 10:44
Hasznos számodra ez a válasz?
 9/16 anonim ***** válasza:

#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ű.

2016. dec. 23. 14:30
Hasznos számodra ez a válasz?
 10/16 A kérdező kommentje:

És ha nem textbox-al iratom ki?

MessageBox.Show(currentNumber.ToString());

Ebben az esetben sem működik.

2016. dec. 23. 14:32
1 2

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!