NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Generátor náhodných čísel

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Libor Sitek
Člen
Avatar
Libor Sitek:2.11.2017 20:38

Ahojte,
potřeboval jsem si naprogramovat funkci, která vrací určitý počet různých náhodných čísel v daném rozsahu. Vymyslel jsem tohle, jen mě zajímá, zda existuje nějaké jednodušší/efek­tivnější řešení, díky!

function generujCisla($od, $do, $pocet) {
    $cisla = [];
    if ($do - $od > $pocet - 2) {
        while (count($cisla) < $pocet) {
            $cislo = rand($od, $do);
            if (!in_array($cislo, $cisla)) {
                $cisla[] = $cislo;
            }
        }
    }
    return $cisla;
}
Odpovědět
2.11.2017 20:38
Když se chce, hledá se jak, když se nechce, hledá se proč
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Libor Sitek
Petr Čech:2.11.2017 20:55

Ahoj, co třeba něco takového:

function generateRandom($from, $to, $count) {
    $res = [];
    if ($to > $from){
          for ( $i = 0; $i < $count; $i++ ){
                $res[] = rand($from, $to);
          }
    }

    return $res;
}

Tvé řešení má několik nedostatků, a sice negeneruje moc náhodná čísla...

  1. if ($do - $od > $pocet - 2) proč? Něco takového by funkce na generování čísel neměla kontrolovat. To je na nějakém kódu, co bude tohle spouštět.
  2. Pokud mají být ta čísla náhodná, nesmíš kontrolovat, jestli ho už máš poznamenané
  3. Je to česky. Kód se nikdy nepíše česky. Jediná přípustná výjimka je, pokud máte zakomplexovaného středoškolského učitele, co to chce česky. Ale to je vše.
Nahoru Odpovědět
2.11.2017 20:55
the cake is a lie
Avatar
ConflictBoy
Člen
Avatar
Odpovídá na Libor Sitek
ConflictBoy:2.11.2017 21:04

Moc nechápu k čemu má být tato podmínka:

if ($do - $od > $pocet - 2)

pokud je tam od toho, aby se nezadalo číslo $od větší něž $do a zároveň aby $pocet nebyl 0, udělal bych radši toto:

function generujCisla($od, $do, $pocet) {
    $cisla = [];
    if ($od >= $do || $pocet < 1) {
        return false;
    }

    while (count($cisla) < $pocet) {
        $cislo = rand($od, $do);
        if (!in_array($cislo, $cisla)) {
            $cisla[] = $cislo;
        }
    }

    return $cisla;
}

Jo a je lepší (aspoň podle mě) psát proměnné v angličtině :)

Nahoru Odpovědět
2.11.2017 21:04
I'm programmer, I have no life :)
Avatar
Libor Sitek
Člen
Avatar
Odpovídá na Petr Čech
Libor Sitek:2.11.2017 21:45

add 1. Souhlasím, podmínku jsem dodělal navíc jen jako pojistku pro případ, kdyby se zadal menší rozsah než je požadovaný počet čísel - pak by se funkce zasekla na while cyklu.
add 2. Potřeboval jsem získat různá náhodná čísla, tedy aby ve výsledném poli nebyla dvě stejná čísla.
add 3. Kód si zatím píšu jen sám pro sebe, ale díky za upozornění, budu se snažit přeorientovat čistě na anglické názvy proměnných a funkcí :-)

Nahoru Odpovědět
2.11.2017 21:45
Když se chce, hledá se jak, když se nechce, hledá se proč
Avatar
Libor Sitek
Člen
Avatar
Odpovídá na ConflictBoy
Libor Sitek:2.11.2017 21:53

Podmínka je tam jen jako pojistka while cyklu, pokud by se zadalo např. (1, 10, 20), pak by se cyklus zasekl, protože nikdy nenaplníš pole 20 různými celými čísly v rozsahu od 1 do 10.

Nahoru Odpovědět
2.11.2017 21:53
Když se chce, hledá se jak, když se nechce, hledá se proč
Avatar
Richard
Inzerent nabídek práce
Avatar
Richard:17.11.2017 10:35

Doporučuji použít rovnou mt_rand místo rand. Rand je teď už jenom alias na mt_rand.

Nahoru Odpovědět
17.11.2017 10:35
Udělej to teď - možná nebudeš mít už čas to udělat později
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.