Zasada losowania liczb pseudolosowych
Ostatnio zmodyfikowano 2020-12-08 09:44
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? |
|
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). |
|
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 |
|
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. |
|
Monika464 Temat założony przez niniejszego użytkownika |
» 2020-12-08 09:44:50 ok dziękuję |
|
« 1 » |