Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] - rand krótkie wyjaśnienie

adriano1191 16 Lis 2013 15:41 837 3
  • #1 16 Lis 2013 15:41
    adriano1191
    Poziom 10  

    Czy może mi ktoś wytłumaczyć na jakiej zasadzie działa losowanie? W tym przypadku z przedziału 10-20. Dlaczego jest to tak zapisane a nie inaczej?
    rand() % (20-10+1)+10;

    0 3
  • Pomocny post
    #2 16 Lis 2013 16:18
    McMonster
    Poziom 32  

    Ponieważ dla komputera nie ma prostego sposobu, żeby wygenerować liczbę z dowolnie wybranego rozmiaru. Losowana jest zawsze liczba o stałej długości. Reszta z dzielenia, uzyskiwana operatorem %, ma bardzo ciekawą właściwość, nigdy nie uzyska się reszty większej, niż dzielnik (pomniejszony o jeden).

    Dlatego ta sztuczka jest powszechnie wykorzystywana do losowania liczby z określonego zakresu, reszta z podzielenia losowej liczby zawsze sama też jest losowa. Natomiast dodanie stałej do liczby losowej również da w wyniku liczbę losową i wynik nigdy nie będzie mniejszy, niż ta dodana stała.

    0
  • #3 16 Lis 2013 21:30
    rufek90
    Poziom 23  

    Od siebie dodam, że dziwi mnie nieco taki zapis. Po co te działania w nawiasie?
    To samo uzyskasz pisząc rand() % 11+10;

    Jak już powiedział przedmówca:
    - samo rand() daje ci jakąś dużą liczbę (sprawdź sobie sam)
    - zapis % 11 ogranicza ci ją do reszty z dzielenia. W tym przypadku reszta może wynosić 0, 1...10. (tu też możesz sprawdzić sobie sam pisząc np 7%11 (wyniesie 7), lub 13%11 (wyniesie 2) lub 22%11 (wyniesie 0)

    Czyli zapis rand() % 11 daje Ci losowe liczby od 0 do 10. Na końcu dodajesz 10, by ostatecznie otrzymać przedział 10-20.

    Ciekawostka: są 'języki', w których rand przedstawia się nieco inaczej. tak jest bodajże w scilabie, więc w matlabie pewnie też. Tam rand to ułamek należący od 0 do 1 i aby otrzymać jakąś całkowitą liczbę, musisz takiego randa pomnożyć i np. zaokrąglać albo dać jakiś floor.

    0
  • #4 16 Lis 2013 23:10
    krru
    Poziom 32  

    Taka zupełnie nie na tym poziomie uwaga - ograniczanie liczb losowych poprzez modulo w w/w sposób daje nieco niejednorodny rozkład. Prawdopodobieństwa niektórych wyników będą większe niż innych.
    Wyjaśnienie jest proste - załóżmy dla uproszenia że rand daje wynik 4 bitowy czyli 0-15.
    Wtedy wyrażenie rand() % 10 da wyniki 0 z prawdopodobieństwem 2/16 (bo pochodzi w 0 i 10) a np. 6 z 1/16.
    Oczywiście jeśli wynikowy zakres jest wielokrotnie mniejszy niż zakres funkcji rand róznica prawdopodobieństw jest mała.

    0