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.

Gerador de números aleatórios abertos

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