Java-ban ezt hogy kellene megvalósítani?
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? :)
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
#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.
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.
#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.
#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.
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.
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!