Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Nicolas Snopek:13.3.2019 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.3.2019 16:46
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Nicolas Snopek
DarkCoder:13.3.2019 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.3.2019 20:37
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Nicolas Snopek:13.3.2019 21:57

Děkuji moc za pomoc, rozhodně pomohlo!

 
Nahoru Odpovědět
13.3.2019 21:57
Avatar
Odpovídá na Nicolas Snopek
Matúš Olejník:16.3.2019 14:42

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

Nahoru Odpovědět
16.3.2019 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.