Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zasada losowania liczb pseudolosowych

Ostatnio zmodyfikowano 2020-12-08 09:44
Autor Wiadomość
Monika464
Temat założony przez niniejszego użytkownika
Zasada losowania liczb pseudolosowych
» 2020-12-06 22:56:12
witam,

jestem zupełnie początkująca wiec wybaczcie jeśli zadaje pytanie
które może potem w kursie będzie wyjaśnione ale chciałabym lepiej zrozumiec zagadnienie dotyczące pseudolosowego losowania liczb

Chodzi o rozdział 16 (do niego na razie dotarłam) mam problem ze zrozumieniem zapisu tego wyrażenia i zasad jego działania


Mam dwa pytania:

1. int wylosowana_liczba =( std::rand() % ile_liczb_w_przedziale ) + startowa_liczba;

w tym zapisie znajduje się znak"+" dlaczego on się tam znajduje chociaż nie ma tam żadnego dodawania a jedynie "zaczepienie"
wylosowanego przedziału począwszy od wybranej liczby?


2.rozumiem ze z podanego wyrażenia wynika ze komputer losuje sobie najpierw wielkość przedziału która to wielkość jest jakoś powiązana z odliczaniem czasu a potem dopiero, po zakotwiczaniu go od właściwej liczby początkowej losuje z niego liczbę o którą pytamy.
Intuicja podpowiada że w takim razie liczby znajdujące się tuż za liczbą zakotwiczająca ten przedział powinny być wylosowywane
ze znacznie większym prawdopodobieństwem niż liczby na końcu tego przedziału (bo skoro najpierw losowany jest przedział to wiadomo że jego początek zostanie wylosowany zawsze a koniec już rzadziej). Czy to wyrażenie w jakiś  sposób to koryguje?
P-177797
DejaVu
» 2020-12-07 10:18:50
1. rand() zwraca jakąś dużą liczbę (np. 63419038123901).
2. % to operacja modulo, czyli reszta z dzielenia.
3. Gdy weźmiesz liczbę 63419038123901 modulo X to otrzymasz liczbę z przedziału od 0 do (X - 1).
4. Dodanie "startowa_liczba" po prostu sprawia, że przedział finalnie otrzymasz od (0 + liczba_startowa) do (X - 1 + liczba_startowa).
P-177798
Monika464
Temat założony przez niniejszego użytkownika
» 2020-12-07 10:49:39
1. Jeżeli dzielę coś dużego przez dajmy na to 50 to w postaci reszty otrzymuje ileś tam, ale nie wiadomo ile. Na pewno mniej niż 50 ale przecież nie zawsze dokładnie (50-1).
Dlatego że reszta z takiego dzielenia równie dobrze może wynieść  1 albo 2 albo 3  jak i 49,bo to jest przypadkowe.
Wcale to nie musi byc x-1 ale może wyjść x- 5 czy x-10 bo przedział wylosował się akurat krótszy.
Jeżeli zdarzy się  pech i zostanie nam modulo 1 (bo się akurat nasza duza liczba tak ładnie przez 50 podzieliła ze została jedynka) a ja ustawie liczbę początkową na 1 to z losowań nie wyjdzie nam nic innego jak 1  :)
Moze szukam dziury w całym ale wydaje mi się ze w tym wyrażeniu jest takie ryzyko, chyba ze coś w tych ustawieniach czasu lub
w innym miejscu przed nim chroni.


2. (0 + liczba_startowa) do (X - 1 + liczba_startowa).
To jest jasne, tyle że mam wątpliwości czy ten koniec przedziału naprawdę taki jest (to co napisałam wyzej) a dwa że przecież wyrażenie

int wylosowana_liczba =( std::rand() % ile_liczb_w_przedziale ) + startowa_liczba;

de facto określa sam koniec przedziału i wygląda jakby to nie liczba byla w ogole losowana a własnie sam przedział czyli to modulo,bo w tym wyrażeniu przecież nie ma wcale tej pierwszej częsci
P-177799
pekfos
» 2020-12-07 17:02:43
de facto określa sam koniec przedziału i wygląda jakby to nie liczba byla w ogole losowana a własnie sam przedział czyli to modulo,bo w tym wyrażeniu przecież nie ma wcale tej pierwszej częsci
Pierwsza część to z definicji zero. Reszta z dzielenia przez 5 to może być tylko 0, 1, 2, 3, lub 4. Czyli w przypadku ogólnym 0, 1, 2, ..., N-1 dla dzielenia przez N. Wynikowych możliwości jest dokładnie N, dlatego dzielisz przez ilość możliwości jakie chcesz mieć. Dodawanie wartości początkowej przesuwa przedział we właściwe miejsce.
P-177800
Monika464
Temat założony przez niniejszego użytkownika
» 2020-12-08 09:44:50
ok dziękuję
P-177803
« 1 »
  Strona 1 z 1