Pergunta

Estou tentando usar o Boost :: Norm_Distribution para gerar uma distribuição normal com média 0 e Sigma 1.

O código a seguir não funciona, pois alguns valores estão acima ou além -1 e 1 (e não deveriam ser). Someont poderia apontar o que estou fazendo de errado?

#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>

int main()
{
  boost::mt19937 rng; // I don't seed it on purpouse (it's not relevant)

  boost::normal_distribution<> nd(0.0, 1.0);

  boost::variate_generator<boost::mt19937&, 
                           boost::normal_distribution<> > var_nor(rng, nd);

  int i = 0; for (; i < 10; ++i)
  {
    double d = var_nor();
    std::cout << d << std::endl;
  }
}

O resultado na minha máquina é:

0.213436
-0.49558
1.57538
-1.0592
1.83927
1.88577
0.604675
-0.365983
-0.578264
-0.634376

Como você pode ver, todos os valores não estão entre -1 e 1.

Obrigado a todos antecipadamente!

EDITAR: É o que acontece quando você tem prazos e evita estudar a teoria antes de fazer a prática.

Foi útil?

Solução

O código a seguir não funciona, pois alguns valores estão acima ou além -1 e 1 (e não deveriam ser). Someont poderia apontar o que estou fazendo de errado?

Não, este é um mal -entendido do desvio padrão (o segundo parâmetro no construtor1) da distribuição normal.

A distribuição normal é a curva familiar. Essa curva indica efetivamente a distribuição de valores. Os valores próximos a onde os picos da curva de sino são mais propensos do que os valores distantes (a cauda da distribuição).

O desvio padrão informa como os valores são espalhados. Quanto menor o número, os valores mais concentrados estiverem em torno da média. Quanto maior o número, os valores menos concentrados estão em torno da média. Na imagem abaixo, você vê que a curva vermelha tem uma variação (a variação é o quadrado do desvio padrão) de 0,2. Compare isso com a curva verde que tem a mesma média, mas uma variação de 1,0. Você pode ver que os valores na curva verde são mais espalhados em relação à curva vermelha. A curva roxa tem variação 5.0 e os valores são ainda mais espalhados.

Então, isso explica por que os valores não estão confinados a [-1, 1]. No entanto, é um fato interessante que 68% dos valores estão sempre dentro de um desvio padrão da média. Portanto, como um teste interessante, escreva um programa para desenhar um grande número de valores de uma distribuição normal com média 0 e variação 1 e conte o número que está dentro de um desvio padrão da média. Você deve obter um número perto de 68% (68.2689492137% para ser um pouco mais preciso).

alt text

1: Do impulso documentação:

normal_distribution(RealType mean = 0, RealType sd = 1);

Construa uma distribuição normal com média média e desvio padrão SD.

Outras dicas

Você não está fazendo nada de errado. Para uma distribuição normal, o Sigma especifica o desvio padrão, não o intervalo. Se você gerar amostras suficientes, verá que apenas cerca de 68% delas estão no intervalo [média - sigma, média + sigma], cerca de 95% dentro de 2 sigma e mais de 99% dentro de 3 sigma.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top