PHP týden Předvánoční slevová akce
Další šance dokončit svůj projekt a získat ceny v hodnotě 10.000 Kč! Pokračování úspěšné letní soutěže - ITnetwork winter
Využij předvánočních slev a získej od nás 20 % bodů navíc zdarma! Zároveň také probíhá PHP týden se slevou na e-learning až 80 %

Diskuze: Generování čísel z intervalu

Aktivity (2)
Avatar
Nicolas Snopek:13. března 16:46

Ahojte,

rád bych se zeptal a rád přiučil jak funguje generování čísel z daného intervalu.. Dejme tomu, že mám vygenerovat náhodné číslo z intervalu <5,30>, nebo <-5,50>, jak to mám zapsat do kódu C přes x=rand()%___.

Byl bych rád za vysvětlení jak se to určuje.. Děkuji.

Zkusil jsem: Hledat internetem..

Chci docílit: Naučit se zapisovat intervaly v generátoru náhodných čisel.

 
Odpovědět
13. března 16:46
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Nicolas Snopek
DarkCoder:13. března 20:37

Celé to spočívá v rozdílu krajních mezí intervalu a posunu.

Funkce rand() vrací celé číslo v rozsahu 0 až RAND_MAX. (hodnota RAND_MAX je definována ve stdlib.h a bude mít hodnotu nejméně 32767. Tato informace je důležitá z důvodu rozsahu mezí, kterž bude použit ve výpočtu.

Pro eliminaci rozsahu jak správně tušíš použiješ operátor modulo (%). Výsledkem je pak hodnota v rozsahu 0 až N-1 kde N je hodnota na pravé straně od operátoru modulo.

Např. rand() % 50 bude hodnota v rozsahu 0 až 49.

Při výpočtu je dobré přičítat hodnotu v modulo části přičítat hodnotu jedna. To nám zahrne do rozsahu i to číslo kterým na které modulo používáme.

Např. rand() % (50 + 1) bude hodnota v rozsahu 0 až 50.

Rozdíl mezi minimální a maximální hodnotou která může nastat je konstantní. 0 bude minimální hodnota a rozdíl mezí intervalu bude maximální hodnota.

Např. pro interval <-5, 50> bude rand() % (50 - (-5) + 1) bude hodnota v rozsahu 0 až 55.

Nyní pomocí posunu určíme hodnotu v daném intervalu. Posun je dán levou mezí. Tuto hodnotu pak budeme k výsledku operace modulo přičítat, čímž se mění jak minimální tak maximální hodnota.

Např. (rand() % (50 - (-5) + 1)) + (-5) bude hodnota v rozsahu -5 až 50. A to je mez kterou požadujeme.

Obecně:

rn = (rand() % (r - l + 1)) + l;

kde rn je náhodné číslo v daném intervalu, r je mez uzavřená zprava, l je mez uzavřená zleva.

Získání náhodného čísla v intervalu ilustruje následující kód:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define COUNT 100

int main(void) {
        int rn, l, r, i;

        // nastavení seedu
        srand((unsigned)time(NULL));

        // nastavení mezí intervalu
        l = -5;
        r = 50;

        // vypis 100 náhodných čísel v intervalu
        for (i = 0; i < COUNT; i++) {
                rn = (rand() % (r - l + 1)) + l;
                printf("%d\n", rn);
        }

        return 0;
}
Nahoru Odpovědět
13. března 20:37
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na DarkCoder
Nicolas Snopek:13. března 21:57

Děkuji moc za pomoc, rozhodně pomohlo!

 
Nahoru Odpovědět
13. března 21:57
Avatar
Odpovídá na Nicolas Snopek
Matúš Olejník:16. března 14:42

Tak aspoň označ jeho odpoveď ako riešenie tvojej otázky :)

Nahoru Odpovědět
16. března 14:42
/* I am not sure why this works but it fixes the problem */
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 4 zpráv z 4.