Generování neshodných náhodných čísel.
- MILHI
- Začátečník

- Registrován: 31. črc 2005
- Kontaktovat uživatele:
Generování neshodných náhodných čísel.
Zdravím. Mám takový menčí problém..... jeho řešení bude zřejmě triviální, ale nemůžu na nic přijít. Potřebuju generovat náhodně čísla v rozsahu 1-10, ale ta generovaná čísla nesmí být stejná. Například budu generovat 4 čísla z tohoto rozsahu a vygeneruje se 3 8 4 3, problém je, že potřebuju nějak ošetřit aby to vygenerovalo naprosto odlišná čísla, ta poslední trojka by měla být nahrazeja jiným náhodným číslem. Problém je že mě nenapadá řešení bez rekurze, protože nemam jak zajistit že se mi třeba znovu nevygeneruje nějaké číslo které už mezi generovanými je, např kdyby byla trojka nahrazena 8. Vůbec by mi to nepomohlo. Ale právě s rekurzí nemám příliš velké skušenosti a zatím všechno co jsem se pokoušel splodit buď nefungovalo nebo končilo nekonečnou smyčkou..... nemohli byste mi poradit jak na procedůru která by toto zajistila? Nejlépe v delphi
- next_ghost
- Začátečník

-
- Registrován: 12. kvě 2005
- Bydliště: Chomutov
- Kontaktovat uživatele:
Rekurze? Jak bys to chtěl proboha řešit rekurzí? Jednoduše si na to udělej pole, vygeneruj je najednou do toho pole a při každym generování dalšího čísla kontroluj shodnost s předchozíma.
C na to ale má mnohem lepší funkci - strfry()
Tam uděláš pole typu char s hodnotama 1-10, ukončíš 0 a máš zaručeno, že se nebudou opakovat (strfry() jenom přehazuje hodnoty v řetězci mezi sebou).
C na to ale má mnohem lepší funkci - strfry()
- MILHI
- Začátečník

- Registrován: 31. črc 2005
- Kontaktovat uživatele:
next_ghost píše:Rekurze? Jak bys to chtěl proboha řešit rekurzí? Jednoduše si na to udělej pole, vygeneruj je najednou do toho pole a při každym generování dalšího čísla kontroluj shodnost s předchozíma.
C na to ale má mnohem lepší funkci - strfry()Tam uděláš pole typu char s hodnotama 1-10, ukončíš 0 a máš zaručeno, že se nebudou opakovat (strfry() jenom přehazuje hodnoty v řetězci mezi sebou).
Mno v tom je tak trošku problém v tý kontrole při generování každýho dalšího, jelikož mi nikdo nezaručí že se znova "náhodně" nevygeneruje nějaký číslo který projde třeba 3 porovnáníma ale na 4 selže, pak se vygeneruje další který selže už na druhym, ale to nemam jak ověřit bez tý rekurze.....
- next_ghost
- Začátečník

-
- Registrován: 12. kvě 2005
- Bydliště: Chomutov
- Kontaktovat uživatele:
- MILHI
- Začátečník

- Registrován: 31. črc 2005
- Kontaktovat uživatele:
Uhmm a jak while cyklem ohlídáš všechny prvky v poli tak aby když to dojede na konec, tak sis mohl bejt jistej že už se v tom poli nenachází žádný schodný čísla. To bys musel projet ještě jednou a situace se může opakovatnext_ghost píše:1) To neni rekurze, to je normální vnořená smyčka s podmínkou na konci
2) Šance, že budeš pořád dokola generovat jenom duplicitní čísla, je malá, a s každym dalšim pokusem dál klesá. Generování 4 neduplicitních čísel 1-10 bude s rozumnym použitim smyček hotový nejvejš za pár pikosekund.
- next_ghost
- Začátečník

-
- Registrován: 12. kvě 2005
- Bydliště: Chomutov
- Kontaktovat uživatele:
chjo...
Přepiš si to do Packalu, kromě cyklu for() bys to měl pochopit bez problémů a cyklus do-while má proti repeat-until negovanou podmínku ukončení.
for() má takovouhle syntaxi: for(inicializace; podmínka běhu; iterace) tělo;
Proti Packalovskýmu foru toho umí mnohem víc, základní for v Packalu (for i := 0 to 10 do ...) vypadá v C takhle:
for(i = 0; i <= 10; i++) ...
Kód: Vybrat vše
int i, j, pole[4];
for(i = 0; i < 4; i++) { // generuj 4 čísla
do {
pole[i] = rand() % 10 + 1; // vygeneruj číslo
for(j = 0; j < i && pole[i] != pole[j]; j++) ; // hledej shody
} while (j != i); // opakuj generování dokud existuje shoda
}
// tady máme 4 různý náhodný čísla
for() má takovouhle syntaxi: for(inicializace; podmínka běhu; iterace) tělo;
Proti Packalovskýmu foru toho umí mnohem víc, základní for v Packalu (for i := 0 to 10 do ...) vypadá v C takhle:
for(i = 0; i <= 10; i++) ...
- MILHI
- Začátečník

- Registrován: 31. črc 2005
- Kontaktovat uživatele:
next_ghost píše:chjo...
Přepiš si to do Packalu, kromě cyklu for() bys to měl pochopit bez problémů a cyklus do-while má proti repeat-until negovanou podmínku ukončení.Kód: Vybrat vše
int i, j, pole[4]; for(i = 0; i < 4; i++) { // generuj 4 čísla do { pole[i] = rand() % 10 + 1; // vygeneruj číslo for(j = 0; j < i && pole[i] != pole[j]; j++) ; // hledej shody } while (j != i); // opakuj generování dokud existuje shoda } // tady máme 4 různý náhodný čísla
for() má takovouhle syntaxi: for(inicializace; podmínka běhu; iterace) tělo;
Proti Packalovskýmu foru toho umí mnohem víc, základní for v Packalu (for i := 0 to 10 do ...) vypadá v C takhle:
for(i = 0; i <= 10; i++) ...
Perfektní, tak nakonec se mi to podařilo. Sice trošku složitěji než to jde napsat v C, ale hlavní je že to funguje. Moc děkuju, bez tebe bych na to asi do pátku nepřišel ;o))) záchránil si mě.
Kód: Vybrat vše
var
O,I,J:integer;
Kontrola:boolean;
begin
Randomize;
Kontrola:=True;
For I:=1 to 4 Do
Begin
repeat
A[i]:=Random(10);
Kontrola:=True;
For j:=1 to I Do
Begin
if i<>j Then
If A[i]=A[j] Then Kontrola:=False;
End;
until (kontrola=true);
End;
end;