Kezdőoldal » Számítástechnika » Programozás » Java-ban ezt hogy kellene...

Java-ban ezt hogy kellene megvalósítani?

Figyelt kérdés

Egy olyan ciklus kellene nekem valójában, ami annyit csinál, hogy generál 4 különböző értéket(int változókba), aminknek az összege mindig 100-at tesz ki.

Azaz véletlenszerűen szeretnék 100%-ot felosztani 4 random %-ra, amiből az egyik érték mindig fixen 60% fölötti, és a maradék 40%-on "osztozik" random részben a másik 3 változó.


Valaki tudna erre írni egy általános ciklust? :)


2015. márc. 22. 00:40
 1/6 Ozmium42 ***** válasza:

Nem ismerem a Java-t, de alapvetően így csinálnám:


x = 100

ciklus (csak háromszor fusson le!):

y = <random integer 1 és x között> -> ez adja az első három számot

x = x-y

ciklus vége

x -> negyedik szám

2015. márc. 22. 01:12
Hasznos számodra ez a válasz?
 2/6 Tengor ***** válasza:

#1, megoldása jó, csak a 60%-os kitételt kihagyta.

Első körben akkor generálj egy random számot 60 és 97 között egész számok esetén vagy 60 és 100 között valós számok esetén.

Aztán a maradékot oszd fel, ahogy #1 írta csak nem 3, hanem 2 ciklussal.

2015. márc. 22. 07:19
Hasznos számodra ez a válasz?
 3/6 anonim ***** válasza:

Az első megoldásával - azon kívül, hogy nincs benne a 60%-os korlát - az a gond, hogy az utolsó érték negatívra is kijöhet. Például ha az első három esetben 90 jön ki mindegyikre.


Ez a feladat első látásra nem is olyan triviális. A 60% kiemelését úgy oldanám meg, hogy a 40%-ot osztanám el igazságosan a 4 változó között, és utána a kijelölthöz adnék még plusz 60%-ot. De azt nem látom, hogy szétosztásnál mit jelent az egyenletes eloszlású véletlen.

2015. márc. 22. 09:11
Hasznos számodra ez a válasz?
 4/6 Ozmium42 ***** válasza:

#3 nincs igazad, mert ott van a ciklusban az x = x-y, így a random szám soha nem lehet nagyobb, mint x, amiből kivonom (ki is próbáltam, hogy működik-e mielőtt elküldtem). A 60% felett teljesen elsiklottam, de nyilván csak annyi módosítás kell, hogy a ciklus előtt legyen egy:


y = x - <random integer 60 és 100 között>

x = x-y

és ezután a ciklus (ami kétszer fut le)


Nem derült ki, hogy a 100, 0, 0, 0 eredmény elfogadható-e.

2015. márc. 22. 09:46
Hasznos számodra ez a válasz?
 5/6 anonim ***** válasza:

#4: Szerintem elég triviális feladat, és Ozmium42 megoldása is teljesen elfogadható, funkcionálisan pontosan úgy működik - a 60%-os kitételt leszámítva -, ahogyan kell. Illetőleg, az utólag javított megoldása hibátlan.


Csúnyán (NOTE: nem fordítottam, nem teszteltem):


public int[] getThatRandomShit() {

˙˙˙˙int available = TOTAL_AVAILABLE;

˙˙˙˙int[] result = new int[SEGMENT_COUNT - 1];

˙˙˙˙for (int i = 0; i < SEGMENT_COUNT; i++) {

˙˙˙˙˙˙˙˙result[i] = (i == 0) ? random.nextInt(TOTAL_AVAILABLE) + 60 : random.nextInt(available);

˙˙˙˙˙˙˙˙available -= result[i];

˙˙˙˙}

˙˙˙˙result[result.length - 1] = available;

˙˙˙˙return result;

}


Valószínűleg azt nézted el, hogy a random értékek mindig 0 és a még elérhető keret közé esnek, inkluzíve. Egy egyszerű JUnit/TestNG tesztosztállyal le tudod ellenőrizni, bár akkor a véletlen faktort illik kivezetni a dologból; ez azonban nem nagy ördöngősség, mivel elég csak mindig a lehető legnagyobb számot visszaadni a mock random generátorból, vagy egyszerűen figyelni a bemenő limitet és assertelni, hogy nem nagyobb a még elérhető keretnél.

2015. márc. 22. 14:37
Hasznos számodra ez a válasz?
 6/6 anonim ***** válasza:

Oké, de azért elég "csálé" ez a random. Az utolsó változó jóval kevesebb százalékot fog kapni várható értékben. Próbáld ki, futtasd le egymmilliószor, a 40%-on osztozó maradék három változó közül az utoljára kiosztottnak jóval kevesebb jut majd, mint az elsőnek, a második pedig a kettő között lesz.


Ha ez nem baj, akkor lehet így, de a "random" alatt a legtöbben valamifajta egyenletes eloszlást szoktak érteni. Ez így nem lesz egyenletes.

2015. márc. 22. 22:29
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!