přejít na obsah přejít na navigaci

Linux E X P R E S, Programovanie v jazyku C++: Generátor pseudonáhodných čísel (1)

Programovanie v jazyku C++: Generátor pseudonáhodných čísel (1)

C++

Začneme v článku s úvodom do funkcii a ukážeme funkcie na generovanie pseudonáhodných čísel. 


Ú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.

Nahoru

Příspěvky

Programovanie v jazyku C++: Generátor pseudonáhodných čísel (1)
Daniel Kozak 21. 06. 2017, 23:50:15
Odpovědět  Odkaz 
>>> Pri volani funkcie rand() získame pseudonáhodné číslo v intervale od 0 do 32767.

No tak to je lež. Funkce rand vrací číslo v intervalu 0 až RAND_MAX. Kde RAND_MAX je hodnota závislá na systému, plarformě a kompilátoru ale né menší než 32767.

Jinak to stím opakovaním ohledně času, tak stačí to stihnout spustit víckrát do vteřiny, kompilace není třeba.
Eduard Boldižár Re: Programovanie v jazyku C++: Generátor pseudonáhodných čísel (1)
Eduard Boldižár 22. 06. 2017, 00:02:29
Odpovědět  Odkaz 
Ok vďaka za upresnenie, opravím
Re: Programovanie v jazyku C++: Generátor pseudonáhodných čísel (1)
NULL 22. 06. 2017, 19:52:37
Odpovědět  Odkaz 
@Daniel Kozák

Nač ty silné výrazy, není lež náhodou to, když někdo uvede nepravdu záměrně, nikoliv omylem nebo chybou?

Přidat názor

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích a pravidlech najdete v nápovědě.
Diskuzi můžete sledovat pomocí RSS kanálu rss



 
 

Top články z OpenOffice.cz