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
Vhodně spustťe losování- 10 čísel ze 100 bez opakování- zobrazte je na pole panelů. Císla umím vygenerovat, ale nevim jak oššetrit aby se mi cisla neopakovali...
děkuji za rady :-)
procedure TForm1.Button14Click(Sender: TObject);
var i,j,ind : integer;
znak:array[1..10] of integer;
begin
for i:=1 to 10 do begin
repeat
ind:= random(100)-1;
znak[i]:=ind;
bt[i].Caption:=intTOstr(ind); // do pole button, vypis do caption u Button
end;
end;
Offline
↑ hans66:
Já tedy čtu, že máš generovat čísla od 1 do 100
To co jsi napsal tak ti bude generovat čísla od -1 do 98
Pokud chceš opravdu čísla od 1 do 99 pak bys musel napsat ind:= random(99)+1;
No a teď k řešení aby se čísla neopakovala.
V Delphi existuje v unitě Math (je potřeba ji přidat do sekce uses) funkce RandomFrom, která z daného pole náhodně vybere nějaký prvek.
Princip bude takový:
Uděláš pole (buď 1..99 nebo já bych vzhledem k zadání udělall 1..100) a to naplníš čísly 1 až 100 (1 až 99)
Pak z něho v cyklu od 1 do 10 budeš vybírat nějaký prvek.
Tomu prvku (číslu), který vybereš přiřadíš hodnotu třeba 0.
Pokud jsi při dalším průchodu vybral prvek s hodnotou 0 (to je už jsi ho předtím vybral) tak tomu zamezíš cyklem while, kdy budeš vybírat tak dlouho až vybereš nenulový.
Nějak takto:
procedure TForm1.Button1Click(Sender: TObject);
var i,c: Integer;
pole: array[1..100] of Integer; //pole čísel
begin
Randomize; //zapnutí generátoru náhodných číse - nezapomenout
Memo1.Clear; //Memo pro výpis
for i := 1 to 100 do //naplnění pole čísly od 1 do 100, index pole odpovídá
pole[i] := i; //příslušnému číslu
for i := 1 to 10 do //cyklus vybírání 10-ti čísel
begin
c := RandomFrom(pole); //vyběr čísla z pole
while c=0 do //když jsi vybral 0, tak vybíráš tak dlouho až to
c := RandomFrom(pole); //nula nebude
pole[c] := 0; //na vybrané místo v poli zapíšeš 0
Memo1.Lines.Add(IntToStr(c)); //toto je pouze pro zobrazení čísel jaká jsi
//postupně vybral
end;
//ten výpis do pole panelů si místo toho Mema udělej jak chceš
end;Offline
Ahoj tak jsem neco sesmolil, císla mi to generuje, deneruje mi to n-tiketu, maximalne 100. chtel bych se zeptat, jak mám porovnávat pole tiket s polem tikety? Jde mi o to jak mam urcit vyhravající tiket, nevím jak mám porovnávat :-(
tiket:array[1..10] of integer; // cisla ktera losuje kancelar
tikety:array[1..10,1..100] of integer;
cislo,p,z,i,j:integer; //n - počet tiketů
nachazi_se:boolean;
begin
label1.Caption:=''; //vymazu label1
memo1.Text:='';
p:=strToInt(edit1.Text);
if (p<=0) or (p>=100)then showmessage('Napiš číslo v rozsahu 1-99!!!');
randomize;
for i:=1 to 10 do // tiket ktery urcuje vyherce
begin
repeat
cislo:=random(99)+1;
nachazi_se:=false; // nachazi se vypnuto
for j:=1 to 10 do
if cislo=tiket[j] then
nachazi_se:=true;
until not nachazi_se;
tiket[i]:=cislo;
bt[i].Caption:=intToStr(cislo);
label1.Caption:=label1.Caption +' '+ intToStr(cislo);
end;
for i:=1 to 10 do
for z:=1 to p do
// tiket ktery urcuje vyherce
begin
tikety[i,p]:=random(99)+1;
memo1.Text:=memo1.Text+' '+ intToStr(tikety[i,p]);
if (tiket[i]=tikety[i,p]) then label4.Caption:=intToStr(p);
end;
end;
Offline
↑ hans66:
Můžeš, prosím tě napsat célé zadání. Z tvého popisu (kdy skáčeš z jednoho na druhé) není jasné o co ti jde.
Např.
co má reprezentovat toto: tikety:array[1..10,1..100] of integer;
co myslíš, že dělá toto:
repeat
cislo:=random(99)+1;
nachazi_se:=false; // nachazi se vypnuto
for j:=1 to 10 do
if cislo=tiket[j] then
nachazi_se:=true;
until not nachazi_se;
To jak zajistit aby se losovaná čísla neopakovala jsem ti už napsal.
Offline