Pascalban hogy kell úgy egy random számot generálni, hogy megadott számok közül válasszon ki egyet?
Annyira nem nehéz értelmezni azt a kódot! :)
Az algoritmust tökéletesen valósítottam meg, csak a paramétereket hangoltam szélsőségesre, hogy megmutassam miért problematikus a megközelítésed. Ennyi!
Ha az jön ki, elveted.
Pascalt ugyan nem tudok, de js tökéletesen megcsinálja:
generálás()
if(generated = 65 or generated = 634765 or ígytovább amennyit akarsz){generálás();}
Nem timeoutol ki semmi.
De a tartományokra felbontás irtózatos hülyeség. Már egy esetén sem látod át, főleg, ha továbbküldöd a debuggernek, úgy törli ki, mint a szart. Senki nem szeret ilyesmikkel szórakozni, tekintve, hogy egy if statementnél gyorsabb dolog aligha lehet, és gyak. biztos, hogy 10000-ből uaz a szám nem jön ki még egyszer.
Hallod, ne vergődj már, de komolyan.
Az én megoldásom tökéletesen hibátlan, csak úgy látszik, te nem tudod felfogni.
Egyébként nekem van egy kész saját kódom C++-ban egy olyan véletlen szám generátorra, ahol be tudod állítani az alsó és felső határokat, és azt hogy generáljon-e olyan számot, ami már volt korábban vagy mindig újakat.
Ugyanezen az elven működik, tökéletesen.
De lehet csak ennyivel jobb programozó vagyok nálad.
A #3-as megoldása, nem kerülhet végtelen ciklusba. Ez csak elméletileg áll fenn, mert nem valódi véletlent használ, hanem álvéletlen generátort. Ha termikus zajból, vagy sugárzó anyagból gyűjtene véletlent, akkor fenn állna a lehetősége a végtelen ciklusnak. Az álvéletlen generátor nem így működik.
Futásidő szempontjából jobb, ha kiválaszt a tömb elemei közül véletlen indexel egyet. Ha több számot kellene kiválasztani ismétlés nélkül, akkor keverést kell használni. Az első elemet megcseréled egy véletlen elemmel a tömbben, majd a másodikat a tömb második elemétől (ez is benne van) lévő részében egy elemmel és így tovább. Ez az algoritmus lineáris, lépésenként egy elemet kell elérni a tömbben.
#18-as nem értem mit értesz univerzális alatt. Bizonyos követelmények fennállása esetén kötelező a végtelen ciklusos megldás használata. Az összes álvéletlen generátor egész biteket/bájtokat ad vissza. Ha nem kettő hatvány hosszú az intervallumod és követelmény az egyenletes eloszlás, nem jó a kb. egyenletes akkor nem veheted simán moduló a byte-ot, mert meg kell nézned nem-e esik az utolsó csonka intervallumba, és ilyenkor muszáj új byte-ot kérned.
Attól mert a programnyelvek készen adják neked ezt a megoldást attól még nem lesz jobb, csak nem látod a ciklust. Megnéztem a Java Random nextInt(n) implementációját abban is így van. És fogadnék, hogy minden programnyelven így csinálják, vagy nem adnak garanciát az egyenletességre (pl. C nyelv rand() függvény ezt te modulózhatod le). Ennyi erővel az összes megoldás nem univerzális, mert mindenki nem kettőhatvány intervallumból kért véletlen számot, és nem tette hozzá, hogy nem egyenletesre gondolt.
Őszintén szólva egyáltalán nem tudom követni, hogy hova fajult a társalgás. Kérdezőnek tökéletesen megfelel Guitar God #3 megoldása, két szám esetén valahogy így:
...
repeat
szam:=random(1000)+1;
until (szam<>6) and (szam<>876);
...
De a pascalban is van in operátor, azzal is lehet:
...
repeat
szam:=random(1000)+1;
until not(szam in[6,13,87,88,876]);
...
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!