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 fiecarerand(). Î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
randpentru coduri de resetare a parolei sau token-uri: secvența poate fi ghicită.
Comenzi înrudite
time.h (time, difftime, mktime, strftime): Lucrul cu data și ora în C: momentul curent, diferența dintre două momente, structura struct tm și formatarea cu strftime.Operatori aritmetici (+ - * / % ++ --): Adunare, scădere, înmulțire, împărțire, restul împărțirii, atribuiri compuse și incrementare cu ++ / –.stdint.h și limits.h: Tipuri întregi cu dimensiune exactă (int32_t, uint8_t) și constantele cu valorile minime și maxime ale tipurilor (INT_MAX).
Întrebări & Exemple de Cod:
rand și srandAi o nelămurire despre utilizarea comenzii
rand și srandsau 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.