Diskuze: Generování čísel z intervalu
Zobrazeno 4 zpráv z 4.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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;
}
Tak aspoň označ jeho odpoveď ako riešenie tvojej otázky
Zobrazeno 4 zpráv z 4.