Aula 27: Geração de Números Aleatórios

Como usar rand() e srand() em C. Intervalos, sementes e aplicações ilustradas.

📖 O que você vai aprender nesta página
✅ O essencial para saber
  • Defina a semente com srand((unsigned)time(NULL));
  • Gere um número com rand()
  • rand() % N para 0 até N-1
⭐ Leia se tiver tempo
  • RAND_MAX e viés do módulo
  • PRNGs melhores (arc4random, Mersenne Twister)
  • Semente fixa para reprodutibilidade

O que é um Número Aleatório?

Um número aleatório é um valor imprevisível, sem padrão regular. Eles aparecem em todo lugar: posições de spawn de inimigos em jogos, simulações de dados, chaves criptográficas e muito mais.
Em C, você gera números pseudoaleatórios com a função rand() 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.

Headers necessários

#include <stdlib.h>   // rand(), srand()
#include <time.h>     // time() - para a semente

rand() e srand()

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.

Definindo a semente

Chamar 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;
}
Esqueceu o srand()? Você vai receber exatamente a mesma saída a cada execução, porque a semente padrão é 1.

Gerando Números em um Intervalo

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;
Resumo das fórmulas
ObjetivoCódigo
0 até N-1rand() % N
1 até Nrand() % N + 1
min até maxrand() % (max - min + 1) + min

Simulador de Dado

?

Aplicação: Pedra-Papel-Tesoura

#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;
}

Aplicação: Embaralhamento de Array (Fisher-Yates)

// 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;
}

Visualizando a Distribuição

A saída de rand() % N é realmente distribuída de forma uniforme? Um histograma mostra. Quanto mais tentativas você executar, mais equilibrada fica a distribuição.
Um bom gerador aleatório faz com que cada resultado tenha a mesma probabilidade. Execuções curtas podem parecer desbalanceadas, mas ao longo de milhares de tentativas, a contagem de cada faixa se aproxima de tentativas/N.

Experimente Você Mesmo

Escreva seus próprios programas que usam números aleatórios. Você pode usar 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;
}
💡 Tente também estas ideias
← Aula anterior
Aula 26: Funções Elementares (math.h)
Próxima aula →
Aula 28: Protótipo & Macro

Aulas relacionadas

Laços, Arrays, Strings
Aula 26: Funções Elementares (math.h)
A biblioteca math.h de C. sqrt, sin, cos, pow e outras funções matemáticas.

Quiz

Teste seu entendimento!

Q1. Qual é o intervalo do valor retornado por rand()?

0 até 99
0 até RAND_MAX
1 até 100

rand() retorna um inteiro entre 0 e RAND_MAX (normalmente pelo menos 32767). Use o operador % para estreitar para um intervalo específico.

Q2. O que o srand() faz?

Gera um número aleatório
Define a semente do gerador aleatório
Ordena números aleatórios

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.

Q3. Qual expressão gera a rolagem de um dado de 1 a 6?

rand() % 6
rand() % 6 + 1
rand() % 7

rand() % 6 retorna de 0 a 5, então somar 1 dá de 1 a 6. rand() % 7 retornaria de 0 a 6.

Compartilhe este artigo
Compartilhar no X Compartilhar no Facebook