rand(3) Library Functions Manual rand(3) NAZWA rand, rand_r, srand - generator liczb pseudolosowych BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int rand(void); void srand(unsigned int seed); [[przestarzale]] int rand_r(unsigned int *seedp); Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)): rand_r(): Od glibc 2.24: _POSIX_C_SOURCE >= 199506L glibc 2.23 i wczesniejsze _POSIX_C_SOURCE OPIS Funkcja rand() zwraca pseudolosowa liczbe calkowita z zakresu pomiedzy 0 a RAND_MAX wlacznie (tj. matematyczny przedzial [0, RAND_MAX]). Funkcja srand() ustawia swoj argument jako wartosc poczatkowa dla nowego ciagu pseudolosowych liczb calkowitych zwracanych przez rand(). Ciagi te sa powtarzalne poprzez wywolanie srand() z ta sama wartoscia poczatkowa. Jesli nie podano wartosci poczatkowej, funkcja rand() automatycznie ustawia te wartosc na 1. Funkcja rand() nie jest wielobiezna, poniewaz uzywa ukrytego stanu, ktory jest modyfikowany przy kazdym wywolaniu. Moze to byc jedynie wartosc ziarna, do wykorzystania przy nastepnym wywolaniu albo cos bardziej zlozonego. Aby uzyskac odtwarzalne zachowanie w aplikacji z watkami, stan ten musi byc jawny; mozna to uzyskac za pomoca funkcji wielobieznej rand_r(). Podobnie jak rand(), rand_r() zwraca pseudolosowa liczbe calkowita z zakresu [0, RAND_MAX]. Argument seedp jest wskaznikiem do unsigned int, ktora jest uzywana do przechowywania stanu pomiedzy wywolaniami. Jesli rand_r() wywola sie z ta sama wartoscia poczatkowa jak liczba wskazywana przez seedp, a wartosc ta nie zostanie zmodyfikowana pomiedzy wywolaniami, to uzyska sie te sama sekwencje pseudolosowa. Wartosc, na ktora wskazuje argument seedp funkcji rand_r() zapewnia jedynie bardzo ograniczona liczbe stanow, wiec opisywana funkcja bedzie bardzo slabym generatorem pseudolosowym. Mozna korzystac z zamiennika w postaci drand48_r(3). WARTOSC ZWRACANA Funkcje rand() i rand_r() zwracaja wartosc z zakresu pomiedzy 0 a RAND_MAX (wlacznie). Funkcja srand() nie zwraca zadnej wartosci. ATRYBUTY Informacje o pojeciach uzywanych w tym rozdziale mozna znalezc w podreczniku attributes(7). +---------------------------+--------------------------+---------------+ |Interfejs | Atrybut | Wartosc | +---------------------------+--------------------------+---------------+ |rand(), rand_r(), srand() | Bezpieczenstwo watkowe | MT-bezpieczne | +---------------------------+--------------------------+---------------+ WERSJE Wersje rand() i srand() w bibliotece C Linuksa korzystaja z tego samego generatora liczb losowych, co random() i srandom(), wiec mniej znaczace bity powinny byc tak samo losowe jak bity bardziej znaczace. Jednakze, w starszych implementacjach rand() i aktualnych implementacjach na roznych systemach, bity mniej znaczace sa znacznie mniej losowe niz bity bardziej znaczace. Nie nalezy korzystac z tej funkcji w aplikacjach, ktore maja byc przenosne, gdy potrzebna jest dobra losowosc (prosze uzywac w zamian random(3)). STANDARDY rand() srand() C11, POSIX.1-2008. rand_r() POSIX.1-2008. HISTORIA rand() srand() SVr4, 4.3BSD, C89, POSIX.1-2001. rand_r() POSIX.1-2001. Przestarzale w POSIX.1-2008. PRZYKLADY POSIX.1-2001 daje nastepujacy przyklad implementacji rand() i srand(), ktory moze byc przydatny, gdy potrzeba jest taka sama sekwencja na dwoch roznych komputerach. static unsigned long next = 1; /* RAND_MAX zaklada sie jako 32767 */ int myrand(void) { next = next * 1103515245 + 12345; return((unsigned)(next/65536) % 32768); } void mysrand(unsigned int seed) { next = seed; } Ponizszy program moze byc zastosowany do wyswietlenia sekwencji pseudolosowej utworzonej przez rand() , gdy zada sie jej okreslone ziarno. Gdy ziarno wynosi -1, program uzywa losowego ziarna. #include #include int main(int argc, char *argv[]) { int r; unsigned int seed, nloops; if (argc != 3) { fprintf(stderr, "Uzycie: %s \n", argv[0]); exit(EXIT_FAILURE); } seed = atoi(argv[1]); nloops = atoi(argv[2]); if (seed == -1) { seed = arc4random(); printf("ziarno: %u\n", seed); } srand(seed); for (unsigned int j = 0; j < nloops; j++) { r = rand(); printf("%d\n", r); } exit(EXIT_SUCCESS); } ZOBACZ TAKZE drand48(3), random(3) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.8 2 maja 2024 r. rand(3)