Podyskutowaliśmy sobie już o wielu kwestiach dotyczących kodu źródłowego, natomiast zabrakło mi tutaj na stronie wyjaśnienia kolejnego terminu związanego już nie tyle z programowaniem, co z całą nauką o komputerach. Pseudolosowość, to jest hasło dzisiejszego artykułu!
Tweet |
NA CZYM POLEGA PSEUDOLOSOWOŚĆ?
Jak zapewne każdy z Was wie, można sprawić żeby komputer wylosował jakąś losową wartość z podanego przedziału (nawet jeśli bez przedziału, to przeważnie losuje z przedziału <0;1)). Muszę Cię rozczarować czytelniku jeden z drugim, jeśli myślisz że losowanie jakie znasz w rzeczywistości funkcjonuje tak samo w komputeryzacji. Co to, to nie!
Kiedy wskakujemy na informatykę, to tu posługujemy się terminem "pseudolosowość"! Określenie procesu losowania wartości "niby losowym" nie jest przypadkowe. Aby zrozumieć skąd się to bierze, musimy poznać nowy termin mający ogromną styczność z poruszanym tematem. Poznajcie "seeda"!
ZASILANIE GENERATORA "SEEDEM"
"Seed" oznacza z angielskiego "nasienie". Nie będę korzystać z polskiego tłumaczenia, bo różnie to się może kojarzyć. Taki "seed" oznacza w gruncie rzeczy liczbę całkowitą dodatnią, którą wprowadza się do generatora liczb pseudolosowych. Interesujące jest to, że za każdym razem gdy podamy tę samą liczbę do generatora i każemy wylosować N liczb, to ZAWSZE, powtarzam ZAWSZE wygeneruje się ta sama sekwencja liczb! Nie tylko te same liczby, ale powtórzy się nawet kolejność ich "generowania"!!!
Oto cała tajemnica dlaczego określa się to "pseudolosowością". Ponieważ za tym losowaniem kryje się mechanizm o naturze deterministycznej. Jeden "seed" zapewni konkretny i przewidywalny ciąg liczb. To dalej jest możliwe, żeby otrzymać inny wynik, ale wymaga podania nowego "seeda". Wtedy algorytm wylosuje zupełnie inną sekwencję, ale nadal będzie ona skończona i składała się z tych samych liczb, jeśli generator otrzyma tę samą wartość.
SPOSÓB NA KAŻDORAZOWO INNĄ SEKWENCJĘ?
Dziecinnie prosty! Wystarczy generatorowi liczb pseudolosowych zaaplikować przy każdym działaniu nowy "seed" i wtedy pseudolosowość będzie już na pierwszy rzut oka niewidoczna. A skąd brać za każdym razem nową wartość? Bardzo popularnym podejściem jest pobranie czasu uniksowego z zegarka systemu operacyjnego. Jest na to pierdylion różnych zapisów w kodzie źródłowym, ale taki najprostszy w języku C wygląda tak:
#include <time.h>
#include <stdlib.h>
int main(void)
{
srand(time(NULL));
for (int i = 1; i <= 10; ++i)
{
printf("Losowa liczba nr %d: %d\n", i, rand());
}
return 0;
}
Funkcja "srand" inicjuje generator liczb pseudolosowych z możliwością wprowadzenia "seeda". Naszym "seedem" jest z kolei funkcja "time" z parametrem NULL. To sprawi, że zostanie pobrana liczba sekund z zegarka systemu operacyjnego. Pętla "for" wypisze pierwszych dziesięć liczb z generatora przy użyciu funkcji "rand" i można kompilować program. Efekt końcowy? Każdorazowo inna sekwencja liczb! A jeśli usuniesz "srand" i ponownie skompilujesz oraz uruchomisz program kilka razy? Jaką sekwencję widzisz ;)?
Moi drodzy, na tym kończymy. Nie będę wprowadzać żadnych dowodów matematycznych ani trudnych zagadnień, bo od tego są fachowe literatury, papierowe i elektroniczne. Podstawową zasadą redagowania na mojej stronie jest pisanie prostym językiem, tak żeby pomóc uczniom zaliczyć przedmiot, studentom skończyć studia, a bezrobotnym znaleźć pracę. I tego się trzymajmy ;)!