Úvod do funkcii
S nejakými funkciami sme sa už stretli počas tohoto seriálu. Napríklad funkciu setw môžete použiť, ak nezabudnete zadeklarovať knižnicu iomanip. Pre zopakovanie, funkciu voláme takto: setw(), vo vnútri sa nachádza nejaký argument napr. setw(5), kde argument 5 znamená posunútie o 5 znakov. Argument nemusí byť číslo, ale aj pole, reťazec, objekt a pod…
Funkcie srand a rand
Generátor pseudonáhodných čísel sa líši od generátora nahodných čísel vzniknutých napríklad náhodnými kvantovými javmi alebo inými fyzikalnými procesmi. Po istom čase môžeme pozorovať pri generátore pseudonahodných čísel istú periodicitu, vzor resp. opakovanie. Avšak zachytenie takéhoto opakovania je spravidla veľmi dlhé a preto väčšina aplikácia využíva práve tieto algoritmy. V časových škálach, ktoré pracujú väčšina programov, môžme generátor pseudonáhodných čísel prehlasiť za spoľahlivý a nerozlišiteľný od skutočne náhodných čísel.
Funkcie z jazyka C fungujú aj v C++ a my v tomto diele si ich precvičíme.
Funkciou srand(unsigned) inicializujeme generátor pseudonáhodných čísel. Pri volaní funkcie rand() získame pseudonáhodné číslo v intervale od 0 do RAND_MAX, kde hodnota RAND_MAX je aspoň 32767. Hodnota RAND_MAX závisí od systému či platforme v ktorej je spúšťaný program.
V prvom príklade vo funkcii srand ako argument zvolíme ľubovoľné číslo.
1. príklad:
#include <iostream> // hlavičkové súbory #include <cstdlib> using namespace std; // priestor mien int main() // hlavná funkcia main { cout << "Postupnost 5 nahodnych cisel: \n"; srand(91); // inicializácia generátora pseudonáhodných čísel for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { int pseudocislo = rand(); // pseudonáhodné číslo cout << pseudocislo << " "; } cout << "\n"; } return 0; // koniec programu }
Výsledok programu:
Postupnost 5 nahodnych cisel: 335 2784 8477 29510 29977 8681 29454 28047 5677 28194 25162 32109 16932 31437 8408 20823 24550 31812 5752 25505 11211 31632 11748 8875 3840
Rozbor programu:
Funkcie na generovanie pseudonáhodných čísel získame z knižnice cstdlib. Argument funkcie srand sme dali číslo, ktoré sme si sami zvolili. Po spustení programu získame čísla jako vidíte v častí „Výsledok programu“. Skúste ale ešte raz spustiť program. Dostanete ten istý výsledok! Totižto, algoritmus na hľadanie pseudonáhodného čísla pracuje s tým, čo ste zadali za argument vo funkcii srand a tak při každom novom spustení programu dostanete to isté.
Nato aby sme sa vyhli opakovaniu, využíjeme ako argument funkcie srand funkciu time. Znie to prvé napočutie divne, ale zvyknete si behom praxe s programovaním.
2. príklad:
#include <iostream> // hlavičkové súbory #include <cstdlib> #include <ctime> using namespace std; // priestor mien int main() // hlavná funkcia main { cout << "Postupnost 5 nahodnuch cisel: \n"; srand(time(0)); // inicializácia generátora pseudonáhodných čísel for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { int pseudocislo = rand(); // pseudonáhodne číslo cout << pseudocislo << " "; } cout << "\n"; } return 0; // koniec programu }
Výsledok programu po prvom spustení:
Postupnost 5 nahodnych cisel: 20814 24570 2179 10033 120 6684 19576 10365 10320 26014 19987 28553 1752 26954 13958 26638 25326 29269 30912 27023 25888 14819 4323 18676 29377
Výsledok programu po druhom spustení:
Postupnost 5 nahodnych cisel: 20967 5457 22595 26897 26153 27400 2021 3855 32701 31967 13035 30623 26471 18199 8413 22329 7819 10518 18652 18570 5361 21527 21892 20682 27589
Rozbor programu:
Teraz sa do hľadania pseudonáhodných čísel zučastňuje funkcia time(0). Táto funkcia vrácia číselnú hodnotu, ktorá vyjadruje počet sekúnd od dátumu 01.01.1970 po súčasný okamih. Tým sme zabezpečili, že dostaneme po každom spustení iný výsledok. No jedine, že by ste stihli dva krát po sebe spustiť program v horizonte menšom ako jednej sekundy.