rand(3) Library Functions Manual rand(3)

rand, rand_r, srand - generator de numere pseudo-aleatorii

Biblioteca C standard (libc, -lc)

#include <stdlib.h>
int rand(void);
void srand(unsigned int seed);
[[depreciat]] int rand_r(unsigned int *seedp);
Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați feature_test_macros(7)):

rand_r():

    Începând cu glibc 2.24:
        _POSIX_C_SOURCE >= 199506L
    glibc 2.23 și versiunile anterioare:
        _POSIX_C_SOURCE

Funcția rand() returnează un număr întreg pseudo-aleatoriu în intervalul de la 0 la RAND_MAX inclusiv (adică intervalul matematic [0, RAND_MAX]).

Funcția srand() stabilește argumentul său ca sămânță pentru o nouă secvență de numere întregi pseudo-aleatorii care va fi returnată de rand(). Aceste secvențe pot fi repetate prin apelarea srand() cu aceeași valoare de sămânță.

În cazul în care nu este furnizată nicio valoare de sămânță, funcția rand() este alimentată automat cu o valoare de 1.

Funcția rand() nu este reentrantă, deoarece utilizează o stare ascunsă care este modificată la fiecare apel. Aceasta ar putea fi doar valoarea inițială care va fi utilizată de următorul apel sau ar putea fi ceva mai elaborat. Pentru a obține un comportament reproductibil într-o aplicație cu fire de execuție, această stare trebuie să fie explicită; acest lucru poate fi realizat cu ajutorul funcției reentrante rand_r().

Ca și rand(), rand_r() returnează un număr întreg pseudo-aleatoriu în intervalul [0, RAND_MAX]. Argumentul seedp este un indicator către un unsigned int care este utilizat pentru a stoca starea între apeluri. Dacă rand_r() este apelat cu aceeași valoare inițială pentru numărul întreg indicat de seedp, iar această valoare nu este modificată între apeluri, atunci va rezulta aceeași secvență pseudo-aleatorie.

Valoarea indicată de argumentul seedp din rand_r() oferă doar o cantitate foarte mică de stare, astfel încât această funcție va fi un generator pseudo-aleatoriu slab. Încercați în schimb drand48_r(3).

Funcțiile rand() și rand_r() returnează o valoare cuprinsă între 0 și RAND_MAX (inclusiv). Funcția srand() nu returnează nicio valoare.

Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).

Interfață Atribut Valoare
rand(), rand_r(), srand() Siguranța firelor MT-Safe

Versiunile de rand() și srand() din biblioteca Linux C utilizează același generator de numere aleatoare ca și random(3) și srandom(3), astfel încât biții de ordin inferior ar trebui să fie la fel de aleatori ca și cei de ordin superior. Cu toate acestea, în implementările mai vechi ale rand() și în implementările actuale pe diferite sisteme, biții de ordin inferior sunt mult mai puțin aleatori decât cei de ordin superior. Nu utilizați această funcție în aplicații destinate să fie portabile atunci când este necesar un bun caracter aleatoriu; (utilizați în schimb random(3).)

C11, POSIX.1-2008.
POSIX.1-2008.

SVr4, 4.3BSD, C89, POSIX.1-2001.
POSIX.1-2001. Obsoletă în POSIX.1-2008.

POSIX.1-2001 oferă următorul exemplu de implementare a rand() și srand(), posibil util atunci când este nevoie de aceeași secvență pe două mașini diferite.


static unsigned long next = 1;
/* RAND_MAX se presupune a fi 32767 */
int myrand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned int seed) {
    next = seed;
}

Următorul program poate fi utilizat pentru a afișa secvența pseudo-aleatoare produsă de rand() atunci când i se dă o anumită sămânță. Atunci când sămânța este -1, programul utilizează o sămânță aleatoare.


#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
    int           r;
    unsigned int  seed, nloops;
    if (argc != 3) {
        fprintf(stderr, "Utilizare: %s <seed> <nloops>\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    seed = atoi(argv[1]);
    nloops = atoi(argv[2]);
    if (seed == -1) {
        seed = arc4random();
        printf("sămânța: %u\n", seed);
    }
    srand(seed);
    for (unsigned int j = 0; j < nloops; j++) {
        r =  rand();
        printf("%d\n", r);
    }
    exit(EXIT_SUCCESS);
}

drand48(3), random(3)

Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.

2 mai 2024 Pagini de manual de Linux 6.8