C# véletlenszerű számgenerálásnál meglehet adni "kivéve" értéket? (bővebben lent)
Sziasztok!
Véletlen szám generálásánál meglehet adni kivételt? A következő a helyzet:
Végrehajtatok két véletlen szám generálást 0,100 értékek között. A második generálásnál viszont feltételül kéne adnom, hogy amit generál az nem lehet egyenlő az első generálásnál kapott értékkel? Első körben 'if' függvényre és a végén 'goto;' --> újragenerálásra gondoltam, de meglehet oldani esetleg egy sorban valami '!= X' megadással esetleg az egyenletben?
Nem lehet kivételt megadni.
Az if nem függvény, goto-t pedig nem használunk, nem 1950 van.
A történet egyszerű, addig kell generálni, amíg a második szám különböző nem lesz az előzőtől.
Ennél persze van jóval hatékonyabb megoldás, mert ez szűk intervallum esetén nagyon rossz megoldás is lehet, de ha 100-ból kell két számot generálni, akkor neked ez megfelel.
"goto-t pedig nem használunk, nem 1950 van."
Ökörség. A nyelvből azt használjuk fel, amit a nyelv tartalmaz, és a goto utasítást tartalmazza. Felejtsétek már el ezt a paranoiát! A processzorokból is törölni kellene az összes ugró utasítást, JA-tól JZ-ig?
Ökörség.
Azért van GOTO, mert speciális esetekben, például optimalizációnál hasznos lehet.
Ettől függetlenül a programok 99%-ban nincs rá szükség, ellenben jó követethetetlen kódot eredményezhet.
Hogy jönnek ide processzor utasítások?
Egy nagyon magas szintű programozási nyelvről van szó.
100%-ig biztos vagyok benne, hogy egyetlen egy példát sem tudsz mutatni, ahol a GOTO hasznos lenne és/vagy ne lehetne sokkal szebb kódot írni nélküle egy kis áttervezéssel.
Ha pedig ilyet valóban nem tudsz, akkor: KUSS. Nincs GOTO.
Bár neked most tökéletesen megfelel az #1 által vázolt megoldás, ezért leírnék neked egy olyat, ami itt ugyan nem túl praktikus, de amikor mondjuk sok számot kell kiválasztani relatíve kevésből ismétlődés nélkül, hasznos lehet.
Legyen mondjuk az, hogy 12 számot akarsz kiválasztani 1-32 közül. Megoldás: Deklarálsz egy 32 elemű tömböt, és feltöltöd rendre a megfelelő értékekkel (1..32). Amikor kigenerálsz egy random számot, a tömb megfelelő elemét kicseréled az elsővel. Ezután már csak 31-ig generálsz random számot, majd az eredményt eggyel eltolod, így 2-32 között kapsz egy számot. A kapott indexen levő számot kicseréled a második indexen lévővel, és a következő generálásnál 31-ig generálsz, és 2-vel tolod el. A procedúrát addig ismétled, amíg megkapod mind a 12 számot, és ez garantálja, hogy lineáris futási ideje legyen. Mivel az eredményt mindig a tömb elejéhez rakod, és az eredményt eltolod a már kiválasztott számok mennyiségével, ezért a random generált számaid mindig olyan indexre fognak mutatni, ahol még ki nem választott szám van. A probléma ezzel annyi, hogy nyilván kell tartani egy tömböt, ahol az összes számot eltárolod. Viszont ez a tmb egyben az eredménytömböd is lesz ilyenkor, mivel a tömb első k eleme lesz az általad random kiválasztott számsorozat.
"A kapott indexen levő számot kicseréled a második indexen lévővel, és a következő generálásnál 31-ig generálsz, és 2-vel tolod el. A procedúrát"
30-ig, bocsi :)
Ökörség.
Azért van GOTO, mert speciális esetekben, például optimalizációnál hasznos lehet.
Ettől függetlenül a programok 99%-ban nincs rá szükség, ellenben jó követethetetlen kódot eredményezhet.
Hogy jönnek ide processzor utasítások?
Egy nagyon magas szintű programozási nyelvről van szó.
100%-ig biztos vagyok benne, hogy egyetlen egy példát sem tudsz mutatni, ahol a GOTO hasznos lenne és/vagy ne lehetne sokkal szebb kódot írni nélküle egy kis áttervezéssel.
Ha pedig ilyet valóban nem tudsz, akkor: KUSS. Nincs GOTO.
#6, a GOTO egy ismert elvi programelem, az ugrás EGYIK megvalósítója. Van még BREAK, EXIT, CONTINUE, csak te ezek szerint nem tudod, hogy ezek is ugrások. A WHILE, UNTIL, LOOP is az. Ha nem azok lennének, akkor a gépi kódban nem ugrással kellene megvalósítani. Maga az ugrás egy létező és nélkülözhetetlen eszköz.
Érdekes lenne tudni, hogy neked mi is az a "nagyon magas" nyelvi szint, de nekem az, amikor a programnyelv sokféle választható mintával, összevont utasítással, függvénnyel, adatkezelési modellel áll a programozó RENDELKEZÉSÉRE. De ne tegye kötelezővé. Nekem ne a kalapács írja elő, hogy hogyan üssek vele, hadd döntsem már el én, ha kérnem szabad.
A nyelvek gyártóitól az állandó varázsszó a hatékonyság. Aminek nevében ránk erőltetnek olyan megoldásokat, amelyek megértése, megtanulása, használata általánosan a "nehéz nyelv" érzetét okozza. Mitől lesz hatékony az, ami a régi módszereknél nehezebb, ezért sokáig tart, mire a programozó rutinként elsajátítja? A magas szint bőséges, akár egymást is átfedő választási lehetőségeket jelentsen, ne értelmetlen megkötéseket.
Ha egy feladat gyors megoldásához nekem a GOTO a legegyszerűbb, akkor a GOTO-t fogom használni, mert ez nem iparművészet, hanem ipar, és sürget az idő. Az ugrás is az istenként szolgált strukturált programozás része, csak elágazásnak hívjuk.
Az egy külön probléma, hogy az ugrás egy olyan lehetőség, amely nehezen követhetővé is tehet egy programrészt. De nehezen követhetővé teheti a rengeteg lokális változó, a többszintes objektumstruktúra, a három-négy-több elemből összerakandó elágazási feltétel is, de az utóbbi elkerülhető ugró utasításokkal. Hívjuk azt GOTO-nak, BREAK-nek, CONTINUE-nak.
De a programnyelv van a programozóért, nem fordítva, ezt esetleg meg kellene érteni.
A C# nem az 50-es években született. Aztán valamiért mégiscsak tettek bele egy GOTO utasításszót. Meg kellett volna kérdezniük téged.
Nem bánom, ha nem bírod a GOTO látványát (de akkor bizonyára nem bírod az azzal adott esetben egyenértékű BREAK látványát sem). Azt sem bánom, sőt, támogatom, ha azt mondod valakinek, hogy figyelj, ember, a GOTO egyszerű, de épp ezért lehet belőle a Sötét Oldal, tartózkodj a használatától, szokd meg az ezt másképp megvalósító formációkat, hosszabb távon te jársz jól vele. Igazad van. Csak ezt a rohadt "már nem 1950 van" típusú öntelt, korlátolt, kioktató, ostoba szólamot hagyd el, mert azzal csak azt sugallod, hogy a programozás bölcs öreg papjának hiszed magad.
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!