Mit kellene javítani, hogy jól fusson a program? (c#, rövid)
Alapjában véve eléggé rég programoztam , csak vissza kellene rázódnom, meg persze tanulni.
Fogalmam sincs mi lehet a probléma
a programnak az ötös lottót kellene szimulálni, és hogy kétszer egy számot ne húzzon ki:
Random rnd = new Random();
int[] nyer = new int [5];
for (int i = 0; i < 5; i++)
{
nyer[i] = rnd.Next(1,6);
int j = 0;
while(i != j)
{
if(nyer[i] == nyer[j])
{
nyer[i] = rnd.Next(1,6);
}
j++;
}
}
Console.Write("A nyerő számok : ");
for (int i = 0; i < nyer.Length; i++)
{
Console.Write("{0}\t",nyer[i]);
}
Console.ReadKey();
A program 1-5ig generál, ez csak tesztelésre csináltam és a végén 1,2,3,4,5 szám kellene kijöjjön (sorrend változás fennáll), majd javítom 1-90ig.
Nem igazán értem a feltételt.
Mármint a while cikluson belüli if feltételt nem érted?
Az aktuális indexig ellenőrzöd, hogy a korábbi indexeken előfordult-e már az aktuálisan generált érték. Ha igen, akkor az aktuális indexre generálsz egy új random értéket.
A probléma ezzel az, hogy másodszorra ugyanúgy generálhatsz egy már meg értéket. Amikor újragenerálsz, ismét a 0. indextől kellene ellenőrznid az akutális indexig.
if(...)
{
....
j = 0;
}
és a while végén még a j++ marad
próbáltam de így sem jó
ha erre gondoltál
A halmaz (angolul: set) adatszerkezetet pont arra találták ki, hogy az ilyen ismétlődéseket kiszűrjék vele.
Random r = new Random();
HashSet<int> WinnerNumbers = new HashSet<int>();
while (WinnerNumbers.Count != 5) {
.. WinnerNumbers.Add(
.. .. r.Next(1, 100)
.. );
}
Ez addig fog számokat generálni, amíg nem lesz 5 darab különböző számod.
using System;
namespace ConsoleTestApp {
public class Program {
public static void Main(string[] args) {
Random rnd = new Random();
int[] nyer = new int[5];
for (int i = 0; i < 5; i++)
{
nyer[i] = rnd.Next(1,6);
int j = 0;
while (j < i)
{
if (nyer[i] == nyer[j])
{
nyer[i] = rnd.Next(1,6);
j = 0;
} else {
j++;
}
}
}
Console.Write("A nyerõ számok : ");
for (int i = 0; i < nyer.Length; i++)
{
Console.Write("{0}\t",nyer[i]);
}
Console.WriteLine();
Console.ReadKey();
}
}
}
Erre van több egyszerű megoldás is, ami úgy generál ismétlések nélkül, hogy nem kell ismételni a randomgenerálást.
Dönthetsz úgy, hogy egy tömbben eltárolod az összes számot, sorban. Ezesetben az egyik legegyszerűbb, ámda picikét költségesebb megoldás, hogy összekevered a tömb elemeit, és kiválasztod az első 5-öt. Vagy:
Először kiválasztasz egy számot rendesen, 1-tól 5-ig (avagy 0-től 4-ig). Majd fogod, és azt az elemet, amit kisorsoltál, kicseréled a tömb első elemével. Ezután a következő számot 2-től 5-ig sorsolod, és az eredményt kicseréled a második elemmel. Így csinálod végig, aztán a tömb első 5 elemében megkapod a nyerő számaidat.
NAmost, ennek van az a hátulütője, hogy számon kell tartani az összes számot, ami nem feltétlenül tetszetős. Némi módosítással viszont ez a metodika átültethető olyan formába, ahol nem kell eltárolni a számokat. Az alapelv hasonló: kisorsols egy számot, feldolgozod, kisorsolod a következőt, eggyel nagyobb kezdőértéktől. A feldolgozás rész az, ami változik. Az én elképzelésemben a legegyszerűbb egy map (avagy Dictionary) használata <int,int> típusparaméterezéssel.
Minden húzáskor ellenőrzöd, hogy a kisorsolt számon szerepel-e érték a Dictionaryben. Ha nem, akkor felveszel egy új kulcs-érték párt benne, a kulcs a kihúzott szám, az érték pedig hogy hanyadik húzás. Ha szerepel, akkor a kihúzott számhoz eltárolt érték lesz az új kisorsolt szám. EZzel újra elvégzed az ellenőrzést a Dictionaryben, ha szerepel, akkor megint a kulcson levő értékre lecseréled, és addig foyltatod, amíg nem veszel fel új párt. Miután végeztél a sorsolással, a szótárban levő kulcsok lesznek a
kisorsolt számaid. Legrosszabb esetben is igencsak véges, és jól becsülhető lefutási ideje van. Ízlés szerint amúgy tovább optimalizálható még.
Kódot nem írok, ahhoz lusta vagyok, de ha valakinek van ekdve, öntse ezt át C#-ba :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!