rand și srand în C

Generează numere pseudo-aleatorii între 0 și RAND_MAX; srand alege punctul de pornire (seed).

Sintaxă
#include <stdlib.h>
int rand(void);
void srand(unsigned int seed);
#define RAND_MAX /* cel puțin 32767 */

Ce face rand și srand

rand() întoarce la fiecare apel un număr între 0 și RAND_MAX. Numerele sunt pseudo-aleatorii: sunt calculate după o formulă, pornind de la o valoare inițială numită seed. Același seed dă mereu aceeași secvență, ceea ce este util la teste.

srand(seed) setează seed-ul. Dacă nu îl apelezi, programul se comportă ca și cum ai fi apelat srand(1). Ca să primești altă secvență la fiecare pornire, se folosește des srand((unsigned)time(NULL)), apelat o singură dată, la începutul programului.

Pentru un interval mic, rand() % 6 + 1 dă un zar de la 1 la 6. rand nu este potrivit pentru parole, coduri sau criptografie; pentru asta folosește generatorul sistemului de operare (de exemplu getrandom pe Linux sau arc4random pe macOS).

Parametri

Parametru Descriere
seed Valoarea de pornire a generatorului.

Ce returnează

rand: un int între 0 și RAND_MAX. srand: nimic.

Exemple

Exemplul 1: Același seed, aceeași secvență

Numerele de mai jos sunt cele date de biblioteca C din macOS. Standardul nu fixează algoritmul lui rand, așa că același seed dă alte numere cu glibc (Linux) sau pe Windows.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    for (int runda = 1; runda <= 2; runda++) {
        srand(42);
        printf("Runda %d:", runda);
        for (int i = 0; i < 5; i++) {
            printf(" %d", rand() % 100);
        }
        printf("\n");
    }
    return 0;
}

Rezultat

Runda 1: 94 23 9 43 26
Runda 2: 94 23 9 43 26

Exemplul 2: Aruncarea unui zar de 10 ori

Numerele de mai jos sunt cele date de biblioteca C din macOS. Standardul nu fixează algoritmul lui rand, așa că același seed dă alte numere cu glibc (Linux) sau pe Windows.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    srand(2026);
    int aparitii[7] = {0};
    for (int i = 0; i < 10; i++) {
        int zar = rand() % 6 + 1;
        aparitii[zar]++;
        printf("%d ", zar);
    }
    printf("\nDe câte ori a ieșit 6: %d\n", aparitii[6]);
    return 0;
}

Rezultat

5 3 3 4 6 4 2 2 1 2 
De câte ori a ieșit 6: 1

Exemplul 3: Seed diferit la fiecare pornire

Cu time(NULL) ca seed, numerele diferă la fiecare rulare, deci rezultatul de mai jos este doar un exemplu.

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

int main(void) {
    srand((unsigned)time(NULL));
    printf("Numărul tău norocos: %d\n", rand() % 49 + 1);
    return 0;
}

Rezultat posibil (diferă la fiecare rulare)

Numărul tău norocos: 23

Greșeli frecvente

  • Apelezi srand(time(NULL)) înainte de fiecare rand(). Într-o secundă time întoarce aceeași valoare, deci primești același număr de mai multe ori.
  • Crezi că seed-ul fix dă aceleași numere pe orice sistem. Algoritmul diferă între biblioteci (macOS, glibc, Windows).
  • Folosești rand pentru coduri de resetare a parolei sau token-uri: secvența poate fi ghicită.

Comenzi înrudite

Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: rand și srand

Ai o nelămurire despre utilizarea comenzii rand și srand sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.