Como usar rand() e srand() em C. Intervalos, sementes e aplicações ilustradas.
srand((unsigned)time(NULL));rand()rand() % N para 0 até N-1RAND_MAX e viés do módulorand() de stdlib.h. Eles são chamados de "pseudo" porque uma fórmula matemática os produz internamente, então não são verdadeiramente aleatórios — mas para o uso do dia a dia, são bons o suficiente.
#include <stdlib.h> // rand(), srand() #include <time.h> // time() - para a semente
rand() retorna um inteiro no intervalo 0 até RAND_MAX (normalmente 2147483647). Mas se você chamá-lo do jeito que está, vai receber a mesma sequência toda vez.
srand(semente) define a "semente" do gerador de números aleatórios, e cada semente produz uma sequência diferente. Chame-a uma vez, no início do programa.
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { srand(time(NULL)); // semente baseada no horário atual (diferente a cada execução) for (int i = 0; i < 5; i++) { printf("%d\n", rand()); } return 0; }
rand() retorna números bem grandes, então use o operador módulo % para estreitar o intervalo.
// 0 a 9 int r = rand() % 10; // 1 a 6 (um dado) int dice = rand() % 6 + 1; // min até max int val = rand() % (max - min + 1) + min;
| Objetivo | Código |
|---|---|
| 0 até N-1 | rand() % N |
| 1 até N | rand() % N + 1 |
| min até max | rand() % (max - min + 1) + min |
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { char *hands[] = {"Pedra", "Tesoura", "Papel"}; srand(time(NULL)); int cpu = rand() % 3; // 0:Pedra 1:Tesoura 2:Papel printf("CPU: %s\n", hands[cpu]); return 0; }
// Embaralhamento Fisher-Yates for (int i = n - 1; i > 0; i--) { int j = rand() % (i + 1); // troca a[i] e a[j] int tmp = a[i]; a[i] = a[j]; a[j] = tmp; }
rand() % N é realmente distribuída de forma uniforme? Um histograma mostra. Quanto mais tentativas você executar, mais equilibrada fica a distribuição.
rand(), srand() e time().#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { srand(time(NULL)); // Rolar um dado 10 vezes for (int i = 0; i < 10; i++) { int dice = rand() % 6 + 1; printf("Rolada %d: %d\n", i + 1, dice); } return 0; }
srand(time(NULL)) e veja execuções idênticasTeste seu entendimento!
rand() retorna um inteiro entre 0 e RAND_MAX (normalmente pelo menos 32767). Use o operador % para estreitar para um intervalo específico.
srand() define a semente do gerador de números aleatórios. Como a mesma semente sempre produz a mesma sequência, time(NULL) é uma escolha comum.
rand() % 6 retorna de 0 a 5, então somar 1 dá de 1 a 6. rand() % 7 retornaria de 0 a 6.