Generování neshodných náhodných čísel.

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Generování neshodných náhodných čísel.

Příspěvek od MILHI »

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
Začátečník
Registrován: 12. kvě 2005
Bydliště: Chomutov
Kontaktovat uživatele:

Příspěvek od next_ghost »

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() :lol: 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).
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

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() :lol: 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
Začátečník
Registrován: 12. kvě 2005
Bydliště: Chomutov
Kontaktovat uživatele:

Příspěvek od next_ghost »

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.
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

next_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.
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 opakovat
next_ghost
Začátečník
Začátečník
Registrován: 12. kvě 2005
Bydliště: Chomutov
Kontaktovat uživatele:

Příspěvek od next_ghost »

chjo...

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
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++) ...
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

next_ghost píše:chjo...

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
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++) ...

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;
Nakonec to tedy vypadá takhle, jak je popsáno výš. THX
Odpovědět

Zpět na „Programování a web“