"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como gerar números aleatórios normalmente distribuídos em C/C++ sem Boost?

Como gerar números aleatórios normalmente distribuídos em C/C++ sem Boost?

Publicado em 23/11/2024
Navegar:243

How to Generate Normally Distributed Random Numbers in C/C   Without Boost?

Gerando números aleatórios com uma distribuição normal em C/C

Pergunta:

Como faço para gerar números aleatórios facilmente seguindo uma distribuição normal em C ou C sem usar Boost bibliotecas?

Resposta:

Transformada de Box-Muller

A transformada de Box-Muller é um método amplamente utilizado para gerar números normalmente distribuídos de um gerador uniforme de números aleatórios. Ele produz valores que aderem com precisão a uma distribuição gaussiana.

A fórmula matemática para a transformada de Box-Muller é a seguinte:

x = sqrt(-2 * log(U1)) * cos(2 * π * U2)
y = sqrt(-2 * log(U1)) * sin(2 * π * U2)

onde:

  • U1 e U2 são números aleatórios uniformemente distribuídos entre 0 e 1
  • xey são números aleatórios normalmente distribuídos com média 0 e desvio padrão 1

Implementação:

Para implementar a transformação Box-Muller em C/C , você pode usar o seguinte código:

#include 
#include 

double box_muller() {
  std::random_device rd;  // Seed the random number generator with a system clock seed
  std::default_random_engine rng(rd());
  std::uniform_real_distribution dist(0.0, 1.0);

  double U1 = dist(rng);
  double U2 = dist(rng);

  double x = sqrt(-2 * log(U1)) * cos(2 * M_PI * U2);
  return x;
}

Uso:

Para gerar um número aleatório normalmente distribuído, basta chamar a função box_muller():

double random_number = box_muller();

O valor de random_number será uma variável aleatória distribuída gaussiana com média 0 e desvio padrão 1.

Nota:

  • A transformação Box-Muller também produz um segundo resultado, y, mas ele pode ser descartado ou salvo para uso posterior.
  • Se você precisar gerar números normalmente distribuídos com média diferente de 0 ou desvio padrão diferente de 1, você pode multiplicar o resultado por uma constante.
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3