Rand

ceer
int rand(void);

Funkcja rand() zwraca kolejną pseudolosową liczbę całkowitą z przedziału <0, RAND_MAX>, gdzie RAND_MAX ma wartość co najmniej 32767. Funkcja nie przyjmuje żadnego argumentu.

Aby przy każdym uruchomieniu aplikacji losowane były inne liczby, należy ustawić tzw. zarodek ciągu liczb pseudolosowych (→ zobacz Srand).
Aby otrzymać liczbę z przedziału mniejszego niż <0, RAND_MAX>, należy użyć operatora reszty z dzielenia całkowitego, modulo (%), pisząc go zaraz po nazwie funkcji rand() wraz z górną granicą przedziału.
Jeżeli z kolei chcemy uzyskać liczbę z przedziału zaczynającego się od innej wartości niż zero, wystarczy zwiększyć wynik losowania o tą wartość.

Przykład wykorzystania funkcji rand()

```c #include <stdio.h> #include <stdlib.h> #include <time.h>

int main(int argc, char* argv[])
{
int i;
srand(time(0)); /* ustawienie zarodka */

/* losowanie liczby z zakresu <0,RAND_MAX> */
printf("Za %d lat nastapi koniec swiata!\n", rand());

/* losowanie liczby z zakresu <0,300> */
printf("A czy wiesz, że spartan nie było 300, a zaledwie %d\n?", rand() % 301);

/* losowanie pięciu liczb z zakresu <1,49> /
printf("W dzisiejszym losowaniu Duzego Lotka wylosowano nastepujace liczby:\n");
for (i=1; i<6; i++)
printf("%d\t", 1 + rand() % 49); /
losowanie liczby z przedziału <1,49> */

/* losowanie liczby z zakresu <1,36> */
printf("Z kolei Twoj Szczesliwy Numerek to: %d\n", 1 + rand() % 36);
return 0;
}

<h2>Uzyskiwanie <i>bardziej losowych</i> liczb pseudolosowych</h2>
<justify>    Do tej pory stosowaliśmy jedynie całkowite zakresy dla losowanych liczb. Okazuje się jednak, że operator modulo (<b>%</b>) powoduje, że pod uwagę brane są mniej znaczące bity, które są znacznie mniej losowe od bitów bardziej znaczących. Jest to błędem starszych interpretacji funkcji <b>rand()</b>, który jednak można łatwo wyeliminować, stosując operacje na liczbach rzeczywistych.</justify>
Dla przykładu, <font color=red><b>bardziej sugerowane</b></span> jest użycie
    
```c
int szczesliwy_numerek = 1 + (int)(rand() / (RAND_MAX + 1.0) * 36);  /* losowanie liczby z zakresu <1,36> */

zamiast:

int szczesliwy_numerek = 1 + rand() % 36;  /* losowanie liczby z zakresu <1,36> */
Generalnie jednak, nie ma znaczenia, z którego rozwiązania skorzystamy. Standardowy generator liczb pseudolosowych w języku [[C]] jest na tyle niedoskonały, że jeżeli planujemy opracować aplikację, która będzie opierała się na liczbach pseudolosowych z prawdziwego zdarzenia, warto opracować, bądź też użyć innej implementacji takowego generatora.
Więcej na temat metody działania generatora licz pseudolosowych można znaleźć na <a href="http://pl.wikipedia.org/wiki/Generator_liczb_pseudolosowych">wikipedii</a>.

Własna interpretacja funkcji losującej liczbę z danego zakresu

```c int xrand (int range_min, int range_max) { int tmp_range; /* jeżeli maksymalny zakres jest większy/równy minimalnemu, wtedy zmniejszamy jego wartość o wartość zakresu minimalnego */ if ( range_max >= range_min ) range_max -= range_min; else { /* jeżeli zakres maksymalny ma mniejszą wartość niż minimalny, obliczamy różnice miedzy zakresami...*/ range_tmp = range_min - range_max; range_min = range_max; /* ... a następnie zamieniamy je miejscami */ range_max = tmp_range; } /* jeżeli zakres maksymalny jest < 0, wtedy funkcja zwróci liczbę losową z danego zakresu * w przeciwnym wypadku zwróci wartość podaną jako zakres minimalny */ return (int)(range_max ? range_min + rand() / (RAND_MAX + 1.0) * (double) range_max : range_min); } ```

Zobacz też:

1 komentarz

Przydało się, dzięki wielkie :)