0Pricing
C++ Academy · Aula

Geradores aleatórios

Gere bits aleatórios

Geradores aleatórios é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.

Por que usar <random>?

O antigo rand() tem baixa qualidade e é difícil de controlar. A biblioteca <random> separa a aleatoriedade em motores (fontes de bits aleatórios) e distribuições (formatos da saída).

#include <iostream>
#include <random>

int main() {
    std::mt19937 engine(42);
    std::cout << "engine produced a value\n";
    unsigned int v = engine();
    std::cout << (v != 0 ? "non-zero" : "zero") << '\n';
    return 0;
}

O Mersenne Twister

std::mt19937 é o motor mais comum: rápido, de alta qualidade e com um período longo. O número indica o tamanho de seu estado em bits.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(1);
    unsigned int a = gen();
    unsigned int b = gen();
    std::cout << (a != b ? "two different values" : "same") << '\n';
    return 0;
}

Os motores são determinísticos

Dada a mesma semente, um motor sempre produz a mesma sequência. É isso que torna os resultados reproduzíveis.

#include <iostream>
#include <random>

int main() {
    std::mt19937 a(123), b(123);
    std::cout << std::boolalpha << (a() == b()) << '\n';
    std::cout << (a() == b()) << '\n';
    return 0;
}

Chamando o motor

Um motor é chamável. Cada chamada engine() retorna o próximo inteiro aleatório bruto em seu intervalo.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(7);
    for (int i = 0; i < 3; ++i) {
        unsigned int v = gen();
        std::cout << (v % 100) << ' ';
    }
    std::cout << '\n';
    return 0;
}

Intervalo do motor

min() e max() informam o intervalo de valores brutos que um motor pode emitir.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen;
    std::cout << "min: " << gen.min() << '\n';
    std::cout << "max: " << gen.max() << '\n';
    return 0;
}

Outros motores

A biblioteca oferece vários motores:

  • minstd_rand: pequeno gerador congruencial linear.
  • mt19937: padrão para uso geral.
  • ranlux48: maior qualidade, porém mais lento.
#include <iostream>
#include <random>

int main() {
    std::minstd_rand lcg(5);
    std::mt19937 mt(5);
    std::cout << (lcg() % 10) << ' ' << (mt() % 10) << '\n';
    return 0;
}

Motor de 64 bits

Use std::mt19937_64 quando precisar de valores aleatórios de 64 bits, por exemplo, para hashes grandes ou intervalos enormes.

#include <iostream>
#include <random>

int main() {
    std::mt19937_64 gen(99);
    unsigned long long v = gen();
    std::cout << "got a 64-bit value: " << (v != 0 ? "yes" : "no") << '\n';
    return 0;
}

Motor versus distribuição

A saída bruta do motor é uniforme em um intervalo enorme. Para obter valores úteis, como o resultado do lançamento de um dado, passe o motor para uma distribuição.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(2024);
    std::uniform_int_distribution<int> die(1, 6);
    std::cout << "rolled " << die(gen) << '\n';
    return 0;
}

Descartando valores

discard(n) avança o motor em n passos sem produzir saída, o que é útil para avançar em uma sequência.

#include <iostream>
#include <random>

int main() {
    std::mt19937 a(10), b(10);
    b.discard(2);
    a(); a();
    std::cout << std::boolalpha << (a() == b()) << '\n';
    return 0;
}

Reutilizando um único motor

Crie um único motor e reutilize-o para toda a aleatoriedade do seu programa. Criar um motor novo a cada vez é desperdício e pode reduzir a qualidade.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(2026);
    std::uniform_int_distribution<int> d10(1, 10);
    int total = 0;
    for (int i = 0; i < 5; ++i) total += d10(gen);
    std::cout << "sum of 5 rolls: " << total << '\n';
    return 0;
}

Armadilha da semente padrão

Um motor construído por padrão usa uma semente padrão fixa, portanto produz a mesma sequência em todas as execuções. Você precisa fornecer uma semente para obter uma variedade real (isso será abordado na próxima lição).

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen; // default seed: same every run
    std::cout << "first value mod 1000: " << (gen() % 1000) << '\n';
    return 0;
}

Verificação rápida

Teste sua compreensão sobre motores aleatórios.

Recapitulação

Você aprendeu sobre motores aleatórios:

  • <random> separa motores (bits) de distribuições (formato)
  • std::mt19937 é o motor preferencial; ele é determinístico para uma determinada semente
  • reutilize um único motor e forneça uma semente adequada para obter uma variedade real

Em seguida, você dará forma à saída do motor usando distribuições.

Perguntas Frequentes

A aula “Geradores aleatórios” é grátis?

Sim — o texto completo de “Geradores aleatórios” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.

O que vou aprender em “Geradores aleatórios”?

Gere bits aleatórios Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C++ Academy?

Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Geradores aleatórios”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C++ Academy?

Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Geradores aleatórios
  2. Distribuições
  3. Inicialização adequada
  4. Exemplos práticos
← Voltar para C++ Academy