Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
↑ Jan Jícha:
mám ještě problem, potřebuju aby se žádné číslo neopakovalo na celkově 7 buttonu kama to generuju, napsal jsem si for cyklus ale nefunguje mi to, a nemůžu najít chybu.
for ii:=1 to 7 do begin
repeat
ind:= random(49)+1;
znak[ii]:=ind;
until not (znak[ii]=KM[ii]);
KM[ii]:=znak[ii];
bt[ii].Caption:=intTOstr(ind);
end;
pole KM a znak jsem si dal ještě před tímto samé nuly a vytvoříl tím pádem
KM je kontrolní množina
takže do ind si dám náhodné číslo, to si dám do pole znak které porovnávam dokud se znak a KM nerovnají, když se nerovnají tak si ho napíšu na button a přidám to číslo do pole znak...
Díky
Offline
↑ Dopikasan:
Ahoj,
můžeš to udělat tak, že si uděláš pole booleanů stejné délky jako počet buttonů, které bude reprezentovat, jestli číslo bylo už použito, nebo ne. V k-tém kroku cyklu pak vygeneruješ náhodné číslo x z rozsahu 1 ... n-k+1, vezmeš x-tý nepoužitý prvek a označíš ho za použitý.
Offline
↑ Bati:
moc tomu nerozumím, podle mě jsem si něco takového udělal
vygeneroval jsem si číslo, které jsem si dal do pole pomocného (znak)
když se toto číslo nerovná číslu v KM (kontrolní množině) tak se zapíše na button a uloží se do pole KM, pokud se rovnají vygeneruje se další náhodné číslo a děje se to samé.
jestli to je blbost, načrtnul bys mi prosím tvoji myšlenku? nějak mi na to nejde přijít.
Offline
↑ Dopikasan:
V tom tvém řešení nechápu proč tam máš zrovna tu 49 u toho randomu, každopádně tam ale nemůžeš mít pevné číslo, nemáš tak zaručeno, že vybereš všechna čísla.
Offline
↑ Dopikasan:
Ty při té kontrole "until not (znak[ii]=KM[ii])" neprobíháš celé pole KM, ale díváš se jen na aktuální prvek, ve kterém zatím není nic (tedy je tam nula, pokud bylo pole na začátku vynulované). Takže taková podmínka je splněná vždycky.
Buď uděláš to co navrhuje Bati, tedy uděláš si pole všech čísel od 1 do 49, a v každém kroku k vygeneruješ kolikáté zatím nepoužité číslo jsi vybral, dojedeš k němu, vezmeš ho a označíš za použité (např. přepsáním na nulu), nebo, a to by bylo možná jednodušší, napíšeš ten svůj cyklus správně. Třeba by po vygenerování čísla šlo vytvořit proměnnou boolean POUZITO, dát do ní false, jako že číslo ještě není použité, a pak projet celé pole KM (stačí ty zatím popsané prvky, tedy do indexu ii-1) a porovnat to vygenerované číslo se všemi prvky KM. Když někde bude shoda, nastavím si POUZITO na true a cyklus skončím. Podmínka v cyklu repeat pak bude něco jako "until not POUZITO"
Offline
↑ LukasM:
Díky, zkusím to asi zítra, tedka jsem na rychlo zkusil "vidláckou" metodu ale funguje :D
until not ((znak[ii]=KM[ii-1]) or (znak[ii]=KM[ii-2]) or (znak[ii]=KM[ii-3]) or (znak[ii]=KM[ii-4]) or (znak[ii]=KM[ii-5])or (znak[ii]=KM[ii-6]));
když je jen 7 prvků v poli tak to jde, kdyby jich tam bylo víc asi by to bylo silně nepraktické :p
Offline
Zdravím,
to co potřebuješ je:
Generování náhodných čísel bez opakování.
Nejednodušší řešení - napíšu to pouze pro 10 čísel, aby to bylo přehlednější, pro 49 je to stejné akorát je seznam delší - program ale není složitější.
Takže vygeneruji si seznam čísel z kterých budu volit:
[1,2,3,4,5,6,7,8,9,10]
Je dlouhý deset znaků, vyberu náhodně jeden z deseti. Pro příklad třeba třetí znak (ne trojku, ale opravdu třetí v pořadí - na tom místě je zrovna trojka):
[1,2,_,4,5,6,7,8,9,10]
Poslední znak přesunu na třetí pozici:
[1,2,10,4,5,6,7,8,9]
To je celý kód. Nyní se to již bude ve smyčce opakovat tolikrát kolik budu volit čísel.
Pro názornost pokračuji:
Mám devět znaků. Budu náhodně vybírat jedno z devíti. Třeba pátý znak:
[1,2,10,4,_,6,7,8,9]
Na pátém místě byla pětka. Poslední znak přesunu místo něj:
[1,2,10,4,9,6,7,8]
Zůstalo mi osm znaků. No a nyní již bude třetí průchod ve smyčce. A zase pokračuji stejným způsobem dokud nevyberu zvolený počet znaků (čísel).
Jednoduché a nemusím nic kontrolovat.
Offline
Doplním, že na této stránce je již uzavřená soutěž o nejrychlejší algoritmus řešící přesně tento problém. Nejrychlejší řešení nechápu a snad ho ani chápat nechci, ale to druhé nejlepší už je schůdné.
Offline