Diskuze: Random
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Trosku nesedi ten rozsah nebot limit 735 neni delitelny 65... treba to je jen preklep - pouzij generator 0-11 a vynasob 65, pak to bude 0-715 a vzdy delitelne
a dalo by sa nejako ešte ošetriť aby sa každé číslo generovalo iba raz, aby sa nevyskytli dve rovnaké čísla?
Vytvoř si pole (nebo vektor, pokud nevíš, kolik čísel budeš generovat), a do něj si vždy ulož vygenerované číslo. Při každém dalším generování si zjisti, jestli vygenerované číslo již není v poli. Pokud ano, generuj znova a opakuj. Pokud ne, přidej ho do pole a můžeš generovat další číslo.
Pokud těch možností máš jen 11-12 (nevím, zda se 715 také může objevit, nebo je to už mimo požadovanou množinu), nebo ti nevadí o něco větší paměťová náročnost, udělej si pole boolů, které bude mít pro každé číslo jednu položku. Například nějak takto:
const size_t pocetMoznosti = 715 / 65; // + 1, pokud chces i 715.
bool vyskyt[pocetMoznosti];
. . .
// Generujeme cislo (resp. jeho index v poli)
size_t index = rand() % pocetMoznosti;
// Overujeme, ze se jeste nevyskytlo
if (!vyskyty[index]) {
// Zaznamename, ze uz se vyskytlo
vyskyty[index] = true;
// "Vygenerujeme" samotne cislo
size_t cislo = index*65;
}
Výhoda spočívá v rychlosti testu na výskyt čísla – časová složitost je konstantní (nezávisí na velikosti pole/počtu možných čísel). Pro takto malé množiny generovaných čísel je to ale v podstat jedno – i postup s ukládáním čísel do pole a jeho procházením bude také fungovat.
Zobrazeno 7 zpráv z 7.