Gerador de números aleatórios C++
Aprenda como gerar números aleatórios em C++ com exemplos de código interativos. Explore rand(), srand(), biblioteca <random>, std::uniform_int_distribution e std::mt19937 com explicações detalhadas.
Editor de código C++
Aprenda como gerar números aleatórios em C++ com exemplos de código interativos. Explore rand(), srand(), biblioteca <random>, std::uniform_int_distribution e std::mt19937 com explicações detalhadas.
#include <iostream>
#include <random>
int main() {
int min = 1;
int max = 100;
int quantity = 5;
// Modern C++ random number generation
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(min, max);
std::cout << "Modern C++ random numbers:" << std::endl;
for (int i = 0; i < quantity; i++) {
int num = dis(gen);
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
Saída
É uma pré-visualização no navegador, sem executar Java ou C++. Os valores não servem para criptografia.
Pré-visualizar exemplo
C++ clássico com rand()
Use a função rand() tradicional de <cstdlib> para gerar números inteiros aleatórios. Simples e amplamente suportado, embora não seja adequado para aplicativos criptográficos devido à baixa qualidade de aleatoriedade.
Precisa de um número aleatório rápido?
Experimente nosso aleatório on-line gerador de números para resultados instantâneos sem escrever nenhum código.
Compreendendo a geração de números aleatórios em C++
O algoritmo de rand() depende da implementação. Os recursos de C++11 separam motores, como std::mt19937, das distribuições; estas não têm um motor mt19937 predefinido.
rand() Function
O algoritmo de rand() depende da implementação. Os recursos de C++11 separam motores, como std::mt19937, das distribuições; estas não têm um motor mt19937 predefinido.
<random> Library
A biblioteca <random> (C++11+) fornece geração moderna de números aleatórios com std::mt19937 (Mersenne Twister), várias distribuições como uniform_int_distribution e melhor qualidade de aleatoriedade que rand().
uniform_int_distribution
std::uniform_int_distribution fornece controlo preciso sobre intervalos de inteiros com distribuição uniforme. Perfeito para aplicações estatísticas, simulações e quando é necessário controlo exato do intervalo.
std::mt19937
O algoritmo de rand() depende da implementação. Os recursos de C++11 separam motores, como std::mt19937, das distribuições; estas não têm um motor mt19937 predefinido.
Casos de uso comuns
Jogos e simulações
Gerar lançamentos de dados aleatórios, cartas sorteios, geração processual e eventos de jogo usando rand() ou a moderna biblioteca <random> em loops e simulações de jogos.
Segurança e criptografia
rand() e std::mt19937 não são geradores criptográficos. Para dados sensíveis, use uma biblioteca criptográfica ou uma API do sistema documentada; std::random_device não garante segurança portável.
Computação de alto desempenho
A moderna biblioteca <random> com std::mt19937 oferece excelente desempenho para gerar grandes quantidades de números aleatórios em aplicativos de HPC e de computação científica.
Teste de software
Criar dados de teste aleatórios, entradas de teste fuzz e casos extremos para garantir cobertura robusta de código e detecção de bugs em aplicativos C++.
Como funciona a geração de números aleatórios em C++
O algoritmo de rand() depende da implementação. Os recursos de C++11 separam motores, como std::mt19937, das distribuições; estas não têm um motor mt19937 predefinido.
O algoritmo de rand() depende da implementação. Os recursos de C++11 separam motores, como std::mt19937, das distribuições; estas não têm um motor mt19937 predefinido.
std::random_device depende da implementação e pode usar um motor determinístico. Não garante resultados imprevisíveis em todas as plataformas.
Sugestões práticas
Evite rand() para novos Código
O algoritmo de rand() depende da implementação. Os recursos de C++11 separam motores, como std::mt19937, das distribuições; estas não têm um motor mt19937 predefinido.
Escolher explicitamente uma semente
Uma semente fixa reproduz a mesma sequência do motor. Os motores C++ não são automaticamente inicializados com entropia do sistema; escolha uma semente quando necessário.
Use distribuições apropriadas
Para intervalos inteiros uniformes, use std::uniform_int_distribution. Para números de ponto flutuante, use std::uniform_real_distribution. Isso garante propriedades estatísticas adequadas.
Especificações técnicas
Algoritmos
- O algoritmo de rand() depende da implementação. Os recursos de C++11 separam motores, como std::mt19937, das distribuições; estas não têm um motor mt19937 predefinido.
- Mersenne Twister (std::mt19937)
- std::random_device depende da implementação e pode usar um motor determinístico. Não garante resultados imprevisíveis em todas as plataformas.
Características de desempenho
- rand(): qualidade de aleatoriedade rápida, mas ruim
- <random>: rápida com qualidade excelente
- std::mt19937: Muito rápido para grandes quantidades
Perguntas frequentes
Quais abordagens C++ são abordadas?
Rand() clássico com srand(), a moderna biblioteca <random>, std::uniform_int_distribution e o mecanismo mt19937.
Posso personalizar os exemplos?
Sim. Defina mínimo, máximo e quantidade no painel de parâmetros e execute para ver o resultado.
Qual abordagem é recomendada hoje?
A biblioteca <random> com distribuição e mecanismo nomeados; rand() sobrevive em código antigo, mas tem qualidade fraca e armadilhas de alcance.
Como faço para propagar o gerador?
std::random_device depende da implementação e pode usar um motor determinístico. Não garante resultados imprevisíveis em todas as plataformas.
Que intervalo devolve o rand() em C++?
rand() devolve valores entre 0 e RAND_MAX, incluindo os extremos. Verifique a plataforma: Microsoft CRT usa 32767; não assuma o mesmo limite noutras.
O rand() é criptograficamente seguro?
rand() e std::mt19937 não são geradores criptográficos. Para dados sensíveis, use uma biblioteca criptográfica ou uma API do sistema documentada; std::random_device não garante segurança portável.
Como gerar números aleatórios de vírgula flutuante em C++?
Combine std::mt19937 com std::uniform_real_distribution configurado para o seu intervalo, por exemplo 0.0 a 1.0, e depois chame dist(generator). O resultado é um double em que o limite inferior está incluído, mas o limite superior está excluído.
O rand() é thread-safe em C++?
A segurança de rand() entre threads depende da implementação. Use um motor por thread ou sincronize o acesso a um motor partilhado.
C++ standard draft: rand / srand · C++ standard draft: random_device · C++ standard draft: uniform_int_distribution
Referências e recursos
-
C++ <random> Reference - cppreference
A referência oficial da biblioteca de geração de números pseudoaleatórios do C++.
-
Mersenne Twister - Wikipedia
O algoritmo Mersenne Twister por trás das bibliotecas de aleatoriedade da maioria das linguagens.