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
- Geradores aleatórios
- Distribuições
- Inicialização adequada
- Exemplos práticos