srand( time( NULL ) ); co ta linijka robi w programie c++ proszę o wytłumaczenie co robi pętla while,for oraz czym jest mediana

srand( time( NULL ) ); co ta linijka robi w programie c++ proszę o wytłumaczenie co robi pętla while,for oraz czym jest mediana
Odpowiedź

Ustawia punkt generowania liczb pseudolosowych w tym przypadku od NULL. Dla przykładu: srand (time(NULL)); cout << (rand() % 100 + 1) << " tu jest liczba...";

Żeby Ci to wytłumaczyć, muszę najpierw w skrócie omówić czym są liczby pseudolosowe. W informatyce nie ma czegoś takiego jak pełna losowość - wszystko jest tylko "podróbą" losowości. Załóżmy, że masz maszynkę, która generuje losową liczbę. Za każdym razem wykonuje ten sam algorytm w celu jej wygenerowania. Algorytm ten przyjmuje jakąś wartość początkową (tzw. seed) i na podstawie tej wartości generuje kolejne liczby. Wyobraź sobie, że jako seed ustawisz liczbę 2. Zaczniesz generować kolejne liczby i rzeczywiście - wydają się one losowe. Jednak kiedy zrestartujesz maszynę i znowu podasz jako seed liczbę 2, otrzymasz dokładnie ten sam ciąg niby losowych liczb. Jak już pisałem dzieje się tak dlatego, że ta maszynka wykonuje dokładnie ten sam algorytm za każdym razem. Kolejną wadą liczb pseudolosowych jest to, że jeśli będziesz generował kolejne liczby przy określonym seedzie, w końcu zaczną się one powtarzać. W zależności od algorytmu, stanie się to prędzej, albo później, ale w końcu się stanie. Teraz już rozumiesz czym jest pseudolosowość. W języku C i C++ algorytm na generowanie kolejnych liczb pseudolosowych jest zawarty w bibliotece stdlib.h. Funkcja srand() ustawia właśnie seed tego algorytmu na wartość podaną w argumencie. Mógłbyś napisać srand(2) i też będzie działać, ale przy ponownym wywołaniu programu ciąg wygenerowanych liczb będzie zawsze taki sam. Z resztą sam to możesz sprawdzić modyfikując kod swojego programu :). Poniżej przykład: int main() {     srand(2);     std::cout << rand() % 10 << " " << rand() % 10 << " " << rand() % 10; }  Ten program wyświetli liczby, które wydają się być losowe. Jednak po ponownym uruchomieniu programu otrzymamy dokładnie te same liczby, bo nie zmienił się seed - jest ustawiony na sztywno. Aby uniknąć takiej sytuacji, musimy przy każdym uruchomieniu programu ustawić inny seed. Dlatego właśnie używamy funkcji time(), która jako argument przyjmuje zmienną o typie time_t, do której przypisze aktualny czas. Oczywiście nie jest to czas w formie czytelnej dla człowieka. Funkcja time zwraca czas w postaci liczby sekund od 1 stycznia 1970 roku do dzisiaj. Jest to tzw. time since epoch. Dla jasności: time_t zmienna; time(zmienna); Powyższy fragment kodu robi dokładnie to samo, co: time_t zmienna; zmienna = time(NULL); Jak widzisz, jeśli w argumencie funkcji time() podamy NULL, to po prostu zwróci ona czas. I o to dokładnie nam chodzi. Podsumowując: Funkcja srand( time( NULL ) ); ustawia seed dla algorytmu losowania na aktualną ilość sekund od 1 stycznia 1970 roku do teraz. Dzięki temu z każdą sekundą zmienia się seed. Ciekawostka: jeśli uruchomisz program dwa razy w ciągu jednej sekundy, seed się nie zmieni i będą generowane te same liczby, co przy pierwszym uruchomieniu.

Dodaj swoją odpowiedź