Kezdőoldal » Számítástechnika » Programozás » C# random kérdés?

C# random kérdés?

Figyelt kérdés

for(i=2;i<=59;i++)

{

j=Math.floor(Math.random()*10)+1

if (j<8)

{

osveny[i]=0

}


Ezt hogyan írnátok le C#-ban (0-tól 10ig akarok random számot generálni.) ? (javascriptben csináltam ezt)



2012. okt. 21. 13:28
 1/8 A kérdező kommentje:

Illetve nem is ez a probléma, hanem ez:


[link]

2012. okt. 21. 13:36
 2/8 2xSü ***** válasza:

1. hibaüzenet: A blokk nyitó és zárójelek száma nem stimmel. Vizuálisan a static void Main(…) után jövő { jelnek nincs meg a párja.


2. A Convert.ToInt32(r) több szempontból is értelmetlen. Egyrészt az „r” változó egy „Random” osztályú objektum, amit nem igazán lehet 32 bites egészre konvertálni. Másrészt amúgy sem csinálsz semmit a visszatérési értékével.


Nem igazán értem mit akar csinálni a program, így bővebb tanácsot nem tudok adni.

2012. okt. 21. 13:50
Hasznos számodra ez a válasz?
 3/8 A kérdező kommentje:

Programozási feladat: Egy ösvényen tócsák és száraz foltok váltogatják egymást. Egy arra járó sétáló maximum 4 egymás melletti tócsát képes átugrani egyszerre. Az ösvényt egy tömbben írjuk le, ahol a 0 jelenti a tócsát, az 1 jelenti a száraz foltot. Készítsünk olyan eljárást, amely egy ilyen tömb alapján meghatározza, hogy a sétáló képes-e átjutni az ösvény egyik végéből a másikba anélkül, hogy tócsába kellene lépnie!


Ez lenne a feladat, és ahol most tartok:

(legh-el van baj, amivel a leghosszabb vizet akarom számolni és nincs ötletem miért)


[link]

2012. okt. 21. 14:11
 4/8 A kérdező kommentje:
Arra már rájöttem, hogy a while elé nem kell az i=2, de még így sem tudom hogyan szűrjem ki ha 5db 'tócsa' van egymás mellett.
2012. okt. 21. 14:22
 5/8 2xSü ***** válasza:

Nulla gyakorlatom van C#-ban, így elnézést, ha esetleg hülyeséget írnék, de azért megpróbálok segíteni.


Egy problémádra itt a megoldás. A véletlenszám generálás C#-ban – tudtommal – a következő módon történik. Ahogy létrehozol egy Random osztályú objektumot, az kap az inicializálás során egy kezdőértéket. Ezt az aktuális időpontból nyeri. Minden véletlenszám generálás ezen az értéken hajt végre egy műveletet, ami egyrészt visszaad egy véletlenszerűnek tűnő számot, másrészt módosítja az osztályban tárolt értéket is. Mivel minden egyes véletlen szám generáláshoz létrehozol egy új objektumot, ezért – mivel nem telik el túl nagy idő ezek között – ugyanazt a kezdőértéket fogja kapni, tehát ugyanazt a véletlenszámot fogja visszaadni. Ha viszont egyszer hoznád létre, akkor nem lenne ilyen gond, maximum akkor, ha a programot ugyanabban a másodpercben többször is elindítanád.


A feladatban amúgy nem szerepel, hogy az első vagy az utolsó kizárólag száraz folt lehet, tehát ezt a részt is ki kellene venni: osveny[0]=0 és osveny[59]=0.


A kódodban szépen kiszámolgatsz tócsákat, de ezeket aztán sehol nem tárolod le a tömbben. A randomNumber változó kap egy értéket, kiírod, de a tömbbe aztán nem teszed bele.


Az if (randomNumber == 0) Console.WriteLine(randomNumber); else Console.WriteLine(randomNumber); soron is mosolyogtam. Tehát ha nulla, akkor írja ki a randomNumber-t, ha nem, akkor meg írja ki a randomNumbert. Viszont azt feltétlenül. :-)


Tehát az első részfeladat, a tócsák generálása valahogy így nézne ki szerintem: [link]


Folyt. köv…

2012. okt. 21. 16:02
Hasznos számodra ez a válasz?
 6/8 2xSü ***** válasza:

[link]


Persze lehet optimalizálni is rendesen a kódot. Pl. végigmész 0-59-ig, hogy tócsákat generálj. Aztán újra végigmész, hogy analizáld a generált adatokat. A kódban soha nem hivatkozol előre a tömbben, tehát simán össze lehet vonni a két részt. No persze emiatt ha csobbanunk, akkor nem fog feltöltődni a tömb teljesen, így mindenképpen végig kell menni 59-ig, és máshogy kell a csobbanást jelezni: [link] (Szintén egy rövidítés, ha az i változót magában a for ciklusban deklarálod.)

2012. okt. 21. 16:36
Hasznos számodra ez a válasz?
 7/8 anonim ***** válasza:

Ez utóbbi megoldás elég szellemes, csak hibás.

A csobbantunk változó abban a pillanatban mutatja csak a vízbe lépést, amikor az bekövetkezik, "emlékezete" nincs.

Ha pl. az első 10 tömbelem víz, akkor a csobbantunk változó értéke true lesz, ha viszont a következő tömbelem már nem víz, akkor a miotaugrik értéke visszavált 0-ra, false-ra állítva ezzel a csobbantunk értékét a következő víz elemnél...

2012. okt. 23. 02:37
Hasznos számodra ez a válasz?
 8/8 2xSü ***** válasza:

#7: Jogos. Viszont ha így javítatlanul világítottál rá a hibámra, lehetőséget kaptam, hogy korrigáljam azt. Annyi, hogy kihagytam egy fontos részt:


csobbantunk = csobbantunk || (++miotaugrik > 4);


Ezt akartam volna írni. Tehát a csobbantunk minden helyzetben akkor lesz igaz, ha valamelyik részkifejezés igaz, azaz:

- Épp most csobbantunk bele.

- Nem most, de régebben már belecsobbantunk, azaz a csobbantunk értéke már igaz.

Tehát ha már egyszer csobbantunk, akkor ez a kifejezés mindenképpen igaz marad.


Azt nem tudom, hogy ilyenkor mit csinál a fordító pontosan. Két eset lehetséges:

- A csobbantunk igaz volta elegendő a teljes kifejezés kiértékeléséhez. Ez nekünk jó, hiszen a növelés és a 4-el való összehasonlítás már nem fog megtörténni, hiszen a teljes kifejezés értéke pusztán az első tagból megállapítható. Jelen esetben ez jó, hiszen nincs is rá szükség, azaz a kód optimálisabb, nem végzi el a felesleges műveleteket. De más eseteben ennek lehetnek negatív, nem várt mellékhatásai, így óvatosan kell kezelni ezt a megoldást.

- Vagy kiértékelődik a teljes kifejezés, a vagy operátor mindkét oldala. Ebben az esetben semmiféle gond nincs.

Nem tudom hogy működik a fordító, ilyen mély ismereteim nincsenek a C#-al kapcsolatban.


Persze meg lehet kicsit érthetőbben is fogalmazni az adott sort, úgy hogy a fenti kérdéssel nem kell foglalkozunk:

if (++miotaugrik > 4) csobbantunk=true;


Itt is az van, hogy soha nem vált vissza a csobbantunk false-ra.

2012. okt. 24. 10:31
Hasznos számodra ez a válasz?

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!