[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20 Distribuições de Números Aleatórios

Esse capítulo descreve funções para geração de um conjunto de valores aleatórios e o cálculo de suas distribuições de probabilidade. Amostras das distribuições descritas nesse capítulo podem ser obtidas usando quaisquer dos geradores de números aleatórios na biblioteca como um código básico de aleatoriedade.

No mais simples dos casos uma distribuição não uniforme pode ser obtida analiticamente a partir da distribuição uniforme de um gerador de números aleatórios aplicando uma transformação apropriada. Esse método usa uma chamada ao gerador de números aleatórios. Distribuições mais complicadas são criadas pelo método aceitação-rejeição, que compara a desejada distribuição frente a uma distribuição que é similar e conhecida analiticamente. Isso comumente requer muitas amostras do gerador.

A biblioteca também fornece funções de distribuição acumulada e funções de distribuição acumulada inversa, algumas vezes referenciadas como funções quantil. As funções de distribuições acumuladas e suas inversas são calculadas separadamente para as caudas alta e baixa da distribuição, permitindo que precisão completa seja mantidas para pequenos resultados.

As funções para um conjunto de valores aleatórios e funções de densidade de probabilidade descritas nessa seção são declaradas em ‘gsl_randist.h’. As corespondentes funções de distribuições acumuladas são declaradas em ‘gsl_cdf.h’.

Note que as funções discretas para um conjunto de valores aleatórios sempre retornam um valor de tipo unsigned int, e sobre a maioria das plataformas esse unsigned int tem um valor máximo de 2^32-1 ~=~ 4.29e9. Essas funções discretas devem somente serem chamadas com um intervalo seguro de parâmetros (onde existe uma probabilidade negligenciável de um conjunto de valores aleatórios exceder esse limite) para prevenir resultados incorretos devido a overflow.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.1 Introdução

Distribuições numéricas aleatórias contínuas são definidas por uma função de densidade de probabilidade, p(x), tal que a probabilidade de x ocorrer no intervalo infinitesimal de x a x+dx é p dx.

A função de distribuição acumulada para a cauda baixa P(x) é definida pela integral,

P(x) =
x

−∞ 
dx′p(x′)
e fornece a probabilidade de um conjunto de valores tomas um valor menor que x.

A função de distribuição acumulada para a cauda alta Q(x) é definida pela integral,

Q(x) =
+∞

x 
dx′p(x′)
e fornece a probabilidade de uma variável tomar um valor maior que x.

As funções de distribuição acumulada para as caudas alta e baixa são relacionadas através de P(x) + Q(x) = 1 e satisfazem 0 <= P(x) <= 1, 0 <= Q(x) <= 1.

The distribuições inversas acumuladas, x=P^{-1}(P) e x=Q^{-1}(Q) fornecem os valores de x que correspondem a um valor específico de P ou Q. Elas podem ser usadas para encontrar limites de confidência a partir de valores de probabilidade.

Para distribuições discretas a probabilidade de amostragem do valor inteiro k é fornecida através de p(k), onde \sum_k p(k) = 1. A distribuição acumulada para a cauda baixa P(k) de uma distribuição discreta é definida como,

P(k) =

i ≤ k 
p(i)
onde o somatório estiver acima do intervalo permitido da distribuição menor que ou igual a k.

A distribuição acumulada para a cauda alta de uma distribuição discreta Q(k) é definida como

Q(k) =

i > k 
p(i)
fornecendo o somatórios de probabilidades para todos os valores maiores que k. Essas duas definições satisfazem a identidade P(k)+Q(k)=1.

Se o intervalo da distribuição for de 1 a n inclusive então P(n)=1, Q(n)=0 enquanto P(1) = p(1), Q(1)=1-p(1).


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.2 A Distribuição de Gauss

Function: double gsl_ran_gaussian (const gsl_rng * r, double sigma)

Essa função retorna um conjunto de valores aleatórios de Gauss, com média zero e desvio padrão sigma. A distribuição de probabilidade para um conjunto de valores de Gauss é,

p(x) dx = 1




2 πσ2
exp(−x2 / 2σ2) dx
Para x no intervalo de -\infty a +\infty. Use a transformação z = \mu + x sobre os números retornados por gsl_ran_gaussian para obter uma distribuiçãod e Gauss com média \mu. Essa função usa o algoritmo de Box-Muller que requer duas chamadas ao gerador de números aleatórios r.

Function: double gsl_ran_gaussian_pdf (double x, double sigma)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição de Gauss com desvio padrão sigma, usando a fórmula fornecida acima.


rand-gaussian-pt_BR
Function: double gsl_ran_gaussian_ziggurat (const gsl_rng * r, double sigma)
Function: double gsl_ran_gaussian_ratio_method (const gsl_rng * r, double sigma)

Essa função calcula um conjunto de valores aleatórios de Gauss usando os métodos alternativo do zigurate de Marsaglia-Tsang e da razão de Kinderman-Monahan-Leva. O algoritmo de zigurate é o algoritmos disponível mais rápido na maioria dos casos.

Function: double gsl_ran_ugaussian (const gsl_rng * r)
Function: double gsl_ran_ugaussian_pdf (double x)
Function: double gsl_ran_ugaussian_ratio_method (const gsl_rng * r)

essas funçãoes calculam resultados para a distribuição unitária de Gauss. Elas são equivalentes às funções acima com um desvio padrão de um, sigma = 1.

Function: double gsl_cdf_gaussian_P (double x, double sigma)
Function: double gsl_cdf_gaussian_Q (double x, double sigma)
Function: double gsl_cdf_gaussian_Pinv (double P, double sigma)
Function: double gsl_cdf_gaussian_Qinv (double Q, double sigma)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição de Gauss com desvio padrão sigma.

Function: double gsl_cdf_ugaussian_P (double x)
Function: double gsl_cdf_ugaussian_Q (double x)
Function: double gsl_cdf_ugaussian_Pinv (double P)
Function: double gsl_cdf_ugaussian_Qinv (double Q)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição unitária de Gauss.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.3 A Distribuição em Cauda de Gauss

Function: double gsl_ran_gaussian_tail (const gsl_rng * r, double a, double sigma)

Essa função fornece um conjunto de valores aleatórios a partir da cauda alta de uma distribuição de Gauss com desvio padrão sigma. Os valores retornados são maiores que o limite inferior a, que deve ser positivo. O método é baseado no famoso algoritmo cauda cunha retângulo de Marsaglia (Ann. Math. Stat. 32, 894–899 (1961)), com esse aspecto explanado em Knuth, v2, 3a. ed, p139,586 (exercício 11).

A distribuição de probabilidade para um conjunto de valores aleatórios em forma de cauda de Gauss é,

p(x) dx = 1

N(a;σ)


2 πσ2
exp(− x2 / 2σ2) dx
para x > a onde N(a;\sigma) é a contante de normalização,
N(a;σ) = 1

2
erfc

a




2 σ2


.

Function: double gsl_ran_gaussian_tail_pdf (double x, double a, double sigma)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição em cauda de Gauss com desvio padrão sigma e limite inferior a, usando a fórmula fornecida acima.


rand-gaussian-tail-pt_BR
Function: double gsl_ran_ugaussian_tail (const gsl_rng * r, double a)
Function: double gsl_ran_ugaussian_tail_pdf (double x, double a)

Essas funções calculam resultados para a cauda de uma distribuição unitária de Gauss. Elas são equivalentes às funções acima com um desvio padrão de um, sigma = 1.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.4 A Distribuição de Gauss a Duas Variáveis

Function: void gsl_ran_bivariate_gaussian (const gsl_rng * r, double sigma_x, double sigma_y, double rho, double * x, double * y)

Essa função gera um par de conjuntos de valores de Gauss correlacionados, com média zero, coeficiente de correlação rho e desvio padrão sigma_x e sigma_y nas direções x e y. A distribuição de probabilidade para um conjunto de valores aleatórios de Gauss a duas variáveis é,

p(x,y) dx dy = 1

2 πσx σy


1−ρ2
exp
(x2x2 + y2y2 − 2 ρx y/(σxσy))

2(1−ρ2)

dx dy
para x,y no intervalo de -\infty a +\infty. O coeficiente de correlação rho deve encontrar-se entre 1 e -1.

Function: double gsl_ran_bivariate_gaussian_pdf (double x, double y, double sigma_x, double sigma_y, double rho)

Essa função calcula a densidade de probabilidade p(x,y) em (x,y) para uma distribuição de Gauss a duas variáveis com desvio padrão sigma_x, sigma_y e coeficiente de correlação rho, usando a fórmula fornecida acima.


rand-bivariate-gaussian-pt_BR

[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.5 A Distribuição Exponencial

Function: double gsl_ran_exponential (const gsl_rng * r, double mu)

Essa função retorna um conjunto de valores aleatórios a partir da distribuição exponencial com média mu. A distribuição é,

p(x) dx = 1

μ
exp(−x/μ) dx
para x >= 0.

Function: double gsl_ran_exponential_pdf (double x, double mu)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição exponencial com média mu, usando a fórmula fornecida acima.


rand-exponential-pt_BR
Function: double gsl_cdf_exponential_P (double x, double mu)
Function: double gsl_cdf_exponential_Q (double x, double mu)
Function: double gsl_cdf_exponential_Pinv (double P, double mu)
Function: double gsl_cdf_exponential_Qinv (double Q, double mu)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição exponencial com média mu.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.6 A Distribuição de Laplace

Function: double gsl_ran_laplace (const gsl_rng * r, double a)

Essa função retorna um conjunto de valores aleatórios a partir de uma distribuição de Laplace com largura a. A distribuição é,

p(x) dx = 1

2 a
exp(−|x/a|) dx
para -\infty < x < \infty.

Function: double gsl_ran_laplace_pdf (double x, double a)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição de Laplace com largura a, usando a fórmula fornecida acima.


rand-laplace-pt_BR
Function: double gsl_cdf_laplace_P (double x, double a)
Function: double gsl_cdf_laplace_Q (double x, double a)
Function: double gsl_cdf_laplace_Pinv (double P, double a)
Function: double gsl_cdf_laplace_Qinv (double Q, double a)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição de Laplace com largura a.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.7 A Distribuição de Potência Exponencial

Function: double gsl_ran_exppow (const gsl_rng * r, double a, double b)

Essa função retorna um conjunto de valores aleatórios a partir da distribuição exponencial potência com parâmetro de ajuste proporcional a e expoente b. A distribuição é,

p(x) dx = 1

2 a Γ(1+1/b)
exp(−|x/a|b) dx
para x >= 0. Para b = 1 temos a distribuição de Laplace. Para b = 2 temos a mesma forma que uma distribuição de Gauss, mas com a = \sqrt{2} \sigma.

Function: double gsl_ran_exppow_pdf (double x, double a, double b)

Essa função calcula a densidade de probabilidade p(x) em x para distribuição de potência exponencial com parâmetro de ajuste proporcional a e expoente b, usando a fórmula fornecida acima.


rand-exppow-pt_BR
Function: double gsl_cdf_exppow_P (double x, double a, double b)
Function: double gsl_cdf_exppow_Q (double x, double a, double b)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) para a distribuição de potência exponencial com parâmetros a e b.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.8 A Distribuição de Cauchy

Function: double gsl_ran_cauchy (const gsl_rng * r, double a)

Essa função retorna um conjunto de valores aleatórios a partir da distribuição de Cauchy com parâmetro de ajuste proporcional a. A distribuição de probabilidade para um conjunto de valores aleatórios de Cauchy é,

p(x) dx = 1

aπ(1 + (x/a)2)
dx
para x no intervalo de -\infty a +\infty. A distribuição de Cauchy é também conhecida como distribuição de Lorentz.

Function: double gsl_ran_cauchy_pdf (double x, double a)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição de Cauchy com parâmetro de ajuste proporcional a, usando a fórmula fornecida acima.


rand-cauchy-pt_BR
Function: double gsl_cdf_cauchy_P (double x, double a)
Function: double gsl_cdf_cauchy_Q (double x, double a)
Function: double gsl_cdf_cauchy_Pinv (double P, double a)
Function: double gsl_cdf_cauchy_Qinv (double Q, double a)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição de Cauchy com parâmetro de ajuste proporcional a.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.9 A Distribuição de Rayleigh

Function: double gsl_ran_rayleigh (const gsl_rng * r, double sigma)

Essa função retorna um conjunto de valores aleatórios a partir de uma distribuição de Rayleigh com parâmetro de ajuste proporcional sigma. A distribuição é,

p(x) dx = x

σ2
exp(− x2/(2 σ2)) dx
for x > 0.

Function: double gsl_ran_rayleigh_pdf (double x, double sigma)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição de Rayleigh com parâmetro de ajuste proporcional sigma, usando a fórmula fornecida acima.


rand-rayleigh-pt_BR
Function: double gsl_cdf_rayleigh_P (double x, double sigma)
Function: double gsl_cdf_rayleigh_Q (double x, double sigma)
Function: double gsl_cdf_rayleigh_Pinv (double P, double sigma)
Function: double gsl_cdf_rayleigh_Qinv (double Q, double sigma)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição de Rayleigh com parâmetro de ajuste proporcional sigma.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.10 A Distribuição de Cauda de Rayleigh

Function: double gsl_ran_rayleigh_tail (const gsl_rng * r, double a, double sigma)

Essa função retorna um conjunto de valores aleatórios a partir da cauda da distribuição de Rayleigh com parâmetro de ajuste proporcional sigma e um limite inferior a. A distribuição é,

p(x) dx = x

σ2
exp((a2 − x2) /(2 σ2)) dx
para x > a.

Function: double gsl_ran_rayleigh_tail_pdf (double x, double a, double sigma)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição em forma de cauda de Rayleigh com parâmetro de juste proporcional sigma e limite inferior a, usando a fórmula fornecida acima.


rand-rayleigh-tail-pt_BR

[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.11 A Distribuição de Landau

Function: double gsl_ran_landau (const gsl_rng * r)

Essa função retorna um conjunto de valores aleatórios a partir de um distribuição de Landau. A distribuição de probabilidade para um conjunto de valores aleatórios de Landau é definida analiticamente pela integral complexa,

p(x) = 1

2 πi

c+i∞

c−i∞ 
ds exp(s log(s) + x s)
Para fins numéricos é mais adequado usar a seguinte forma equivalente da integral,
p(x) = (1/π)


0 
dt exp(−t log(t) − x t) sin(πt).

Function: double gsl_ran_landau_pdf (double x)

Essa função calcula a densidade de probabilidade p(x) em x para a distribuição de Landau usando uma aproximação para a fórmula fornecida acima.


rand-landau-pt_BR

[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.12 A Distribuições Alfa Estável de Levy

Function: double gsl_ran_levy (const gsl_rng * r, double c, double alpha)

Essa função retorna um conjunto de valores aleatórios a partir de uma distribuição estável simétrica de Levy com ajuste proporcional c e expoente alpha. A distribuição de probabilidade estável simétrica é definida através de uma transformação de Fourier,

p(x) = 1

2 π

+∞

−∞ 
dt exp(−it x − |c t|α)
Não existe solução explícita para a forma de p(x) e a GSL não define uma função correspondente pdf. Para \alpha = 1 a distribuição se reduz à distribuição de Cauchy. Para \alpha = 2 é uma distribuição de Gauss com \sigma = \sqrt{2} c. Para \alpha < 1 a cauda da distribuição torna-se extremamente comprida.

O algoritmo somente funciona para 0 < alpha <= 2.


rand-levy-pt_BR

[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.13 A Distribuição de Levy assimétrica alfa estável

Function: double gsl_ran_levy_skew (const gsl_rng * r, double c, double alpha, double beta)

Essa função retorna um conjunto de valores aleatórios a partir da distribuição estável irregular de Levy com ajuste proporcional c, expoente alpha e parâmetro de distorção beta. O parâmetro de distorção deve estar no intervalo [-1,1]. A distribuição de probabilidade estável irregular de Levy é definida pela transformação de Fourier,

p(x) = 1

2 π

+∞

−∞ 
dt exp(−it x − |c t|α (1−i βsign(t) tan(πα/2)))
Quando \alpha = 1 o termo \tan(\pi \alpha/2) é substituído por -(2/\pi)\log|t|. Não existe solução explícita para a forma de p(x) e a GSL não define uma correspondente função pdf (44). Para \alpha = 2 a distribuição reduz-se à distribuição de Gauss com \sigma = \sqrt{2} c e o parâmetro de distorção não tem efeito. Para \alpha < 1 as caudas da distribuição tornam-se extremamente compridas. A distribuição simétrica corresponde a \beta = 0.

O algoritmo somente funciona para 0 < alpha <= 2.

As distribuições estáveis alfa de Levy possuem a propriedade de que se o conjunto de valores aleatórios estáveis alfa N são desenhados a partir da distribuição p(c, \alpha, \beta) então o somatório Y = X_1 + X_2 + \dots + X_N irá também ser distribuído como um conjunto de valores aleatórios estáveis alfa, p(N^(1/\alpha) c, \alpha, \beta).


rand-levyskew-pt_BR

[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.14 A Distribuição Gama

Function: double gsl_ran_gamma (const gsl_rng * r, double a, double b)

Essa função retorna um conjunto de valores aleatórios a partir da distribuição gama. A função de distribuição é,

p(x) dx = 1

Γ(a) ba
xa−1 e−x/b dx
para x > 0.

A distribuição gama com um parâmetro inteiro a é conhecida como a distribuição de Erlang.

O conjunto de valores aleatórios são calculados usando o método gama rápido de Marsaglia-Tsang. Essa função para esse método foi antigamente chamada de gsl_ran_gamma_mt e pode ainda ser acessada usando esse nome.

Function: double gsl_ran_gamma_knuth (const gsl_rng * r, double a, double b)

Essa função retorna um conjunto de valores aleatórios gama usando o algoritmo de Knuth (vol 2).

Function: double gsl_ran_gamma_pdf (double x, double a, double b)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição gama com parâmetros a e b, usando a fórmula fornecida acima.


rand-gamma-pt_BR
Function: double gsl_cdf_gamma_P (double x, double a, double b)
Function: double gsl_cdf_gamma_Q (double x, double a, double b)
Function: double gsl_cdf_gamma_Pinv (double P, double a, double b)
Function: double gsl_cdf_gamma_Qinv (double Q, double a, double b)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição gama com parâmetros a e b.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.15 A Distribuição Uniforme

Function: double gsl_ran_flat (const gsl_rng * r, double a, double b)

Essa função retorna um conjunto de valores aleatórios a partir da distribuição uniforme de a até b. A distribuição é,

p(x) dx = 1

(b−a)
dx
se a <= x < b e 0 de outra forma.

Function: double gsl_ran_flat_pdf (double x, double a, double b)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição uniforme de a a b, usando a fórmula fornecida acima.


rand-flat-pt_BR
Function: double gsl_cdf_flat_P (double x, double a, double b)
Function: double gsl_cdf_flat_Q (double x, double a, double b)
Function: double gsl_cdf_flat_Pinv (double P, double a, double b)
Function: double gsl_cdf_flat_Qinv (double Q, double a, double b)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para uma distribuição uniforme de a a b.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.16 A Distribuição Lognormal

Function: double gsl_ran_lognormal (const gsl_rng * r, double zeta, double sigma)

Essa função retorna um conjunto de valores aleatórios a partir da distribuição lognormal. A função de distribuição é,

p(x) dx = 1

x


2 πσ2
exp(−(ln(x) − ζ)2/2 σ2) dx
para x > 0.

Function: double gsl_ran_lognormal_pdf (double x, double zeta, double sigma)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição lognormal com parâmetros zeta e sigma, usando a fórmula fornecida acima.


rand-lognormal-pt_BR
Function: double gsl_cdf_lognormal_P (double x, double zeta, double sigma)
Function: double gsl_cdf_lognormal_Q (double x, double zeta, double sigma)
Function: double gsl_cdf_lognormal_Pinv (double P, double zeta, double sigma)
Function: double gsl_cdf_lognormal_Qinv (double Q, double zeta, double sigma)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição lognormal com parâmetros zeta e sigma.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.17 A Distribuição Chi-quadrada

A distribuição chi-quadrada aparece em estatísticas. Se Y_i forem n conjuntos de valores aleatórios de Gauss independentes com variância unitária então as somas de quadrados,

Xi =

i 
Yi2
possuem uma distribuição chi-quadrada com n graus de liberdade.

Function: double gsl_ran_chisq (const gsl_rng * r, double nu)

Essa função retorna um conjunto de valores aleatórios a partir da distribuição chi-quadrada com nu graus de liberdade. A função de distribuição é,

p(x) dx = 1

2 Γ(ν/2)
(x/2)ν/2 − 1 exp(−x/2) dx
para x >= 0.

Function: double gsl_ran_chisq_pdf (double x, double nu)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição chi-quadrada com nu graus de liberdade, usando a fórmula fornecida acima.


rand-chisq-pt_BR
Function: double gsl_cdf_chisq_P (double x, double nu)
Function: double gsl_cdf_chisq_Q (double x, double nu)
Function: double gsl_cdf_chisq_Pinv (double P, double nu)
Function: double gsl_cdf_chisq_Qinv (double Q, double nu)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição chi-quadrada com nu graus de liberdade.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.18 A Distribuição F

A distribuição F aparece em estatísticas. Se Y_1 e Y_2 forem divergentes de forma chi-quadrada com \nu_1 e \nu_2 graus de liberdade então a razão,

X = (Y1 / ν1)

(Y2 / ν2)
tem uma distribuição F F(x;\nu_1,\nu_2).

Function: double gsl_ran_fdist (const gsl_rng * r, double nu1, double nu2)

Essa função retorna um conjunto de valores aleatórios a partir da distribuição F com graus de liberdade nu1 e nu2. A função de distribuição é,

p(x) dx = Γ((ν1 + ν2)/2)

Γ(ν1/2) Γ(ν2/2)
ν1ν1/2 ν2ν2/2 xν1/2 − 12 + ν1 x)−ν1/2 −ν2/2
para x >= 0.

Function: double gsl_ran_fdist_pdf (double x, double nu1, double nu2)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição F com nu1 e nu2 graus de liberdade, usando a fórmula fornecida acima.


rand-fdist-pt_BR
Function: double gsl_cdf_fdist_P (double x, double nu1, double nu2)
Function: double gsl_cdf_fdist_Q (double x, double nu1, double nu2)
Function: double gsl_cdf_fdist_Pinv (double P, double nu1, double nu2)
Function: double gsl_cdf_fdist_Qinv (double Q, double nu1, double nu2)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição F com nu1 e nu2 graus de liberdade.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.19 A Distribuição t

A distribuição t aparece em estatísticas. Se Y_1 tem uma distribuição normal e Y_2 tem uma distribuição chi-quadrada com \nu graus de liberdade então a razão,

X = Y1



 

Y2 / ν
 
tem uma distribuição t t(x;\nu) com \nu graus de liberdade.

Function: double gsl_ran_tdist (const gsl_rng * r, double nu)

Essa função retorna um conjunto de valores aleatórios a partir da distribuição t. A função de distribuição é,

p(x) dx = Γ((ν+ 1)/2)



 

πν
 
Γ(ν/2)
(1 + x2/ν)−(ν+ 1)/2 dx
for -\infty < x < +\infty.

Function: double gsl_ran_tdist_pdf (double x, double nu)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição t com nu graus de liberdade, usando a fórmula fornecida acima.


rand-tdist-pt_BR
Function: double gsl_cdf_tdist_P (double x, double nu)
Function: double gsl_cdf_tdist_Q (double x, double nu)
Function: double gsl_cdf_tdist_Pinv (double P, double nu)
Function: double gsl_cdf_tdist_Qinv (double Q, double nu)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição t com nu graus de liberdade.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.20 A Distribuição Beta

Function: double gsl_ran_beta (const gsl_rng * r, double a, double b)

Essa função retorna um conjunto de valores aleatórios a partir da distribuição beta. A função de distribuição é,

p(x) dx = Γ(a+b)

Γ(a) Γ(b)
xa−1 (1−x)b−1 dx
para 0 <= x <= 1.

Function: double gsl_ran_beta_pdf (double x, double a, double b)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição beta com parâmetros a e b, usando a fórmula fornecida acima.


rand-beta-pt_BR
Function: double gsl_cdf_beta_P (double x, double a, double b)
Function: double gsl_cdf_beta_Q (double x, double a, double b)
Function: double gsl_cdf_beta_Pinv (double P, double a, double b)
Function: double gsl_cdf_beta_Qinv (double Q, double a, double b)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição beta com parâmetros a e b.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.21 A Distribuição Logística

Function: double gsl_ran_logistic (const gsl_rng * r, double a)

Essa função retorna um conjunto de valores aleatórios a partir da distribuição logística. A função de distribuição é,

p(x) dx = exp(−x/a)

a (1 + exp(−x/a))2
dx
for -\infty < x < +\infty.

Function: double gsl_ran_logistic_pdf (double x, double a)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição logística com parâmetro de ajuste proporcional a, usando a fórmula fornecida acima.


rand-logistic-pt_BR
Function: double gsl_cdf_logistic_P (double x, double a)
Function: double gsl_cdf_logistic_Q (double x, double a)
Function: double gsl_cdf_logistic_Pinv (double P, double a)
Function: double gsl_cdf_logistic_Qinv (double Q, double a)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição logística com parâmetro de ajuste proporcional a.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.22 A Distribuição de Pareto

Function: double gsl_ran_pareto (const gsl_rng * r, double a, double b)

Essa função retorna um conjunto de valores aleatórios a partir de uma distribuição de Pareto de ordem a. A função de distribuição é,

p(x) dx = (a/b) / (x/b)a+1 dx
para x >= b.

Function: double gsl_ran_pareto_pdf (double x, double a, double b)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição de Pareto com expoente a e ajuste proporcional b, usando a fórmula fornecida acima.


rand-pareto-pt_BR
Function: double gsl_cdf_pareto_P (double x, double a, double b)
Function: double gsl_cdf_pareto_Q (double x, double a, double b)
Function: double gsl_cdf_pareto_Pinv (double P, double a, double b)
Function: double gsl_cdf_pareto_Qinv (double Q, double a, double b)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição de Pareto com expoente a e ajuste proporcional b.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.23 Distribuições de Vetor Esférico

As distribuições esféricas geram vetores aleatórios, localizados sobre uma superfície esférica. Eles podem ser usados como direções aleatórias, po exemplo nos passos de uma caminhada aleatória.

Function: void gsl_ran_dir_2d (const gsl_rng * r, double * x, double * y)
Function: void gsl_ran_dir_2d_trig_method (const gsl_rng * r, double * x, double * y)

Essa função retorna um vetor de direção aleatória v = (x,y) em duas dimensões. O vetor é normalizado de forma que |v|^2 = x^2 + y^2 = 1. O caminho óbvio para fazer isso é tomar um número aleatório uniforme entre 0 e 2\pi e pegar x e y como sendo o seno e o cosseno respectivamente. Duas funções trigonométricas podem ter sido dispendiosas nos velhos dias, mas com modernas implementações de hardware, esse é algumas vezes o caminho mais rápido a seguir. Esse é o caso para o Pentium (mas não o caso para Sun Sparcstation). Se pode evitar as avaliações trigonométricas escolhendo x e y no interior de círculo unitário (escolha-os em aleatoriedade a partir do interior do quadrado circunscrito, a seguir rejeite aqueles que estiverem fora do círculo unitário), e conclua dividindo por \sqrt{x^2 + y^2}. Uma aproximação mais inteligente, atribuida a von Neumann (Veja em Knuth, v2, 3a. ed, p140, exercício 23), não precisa nem de trigonometria nem de uma raís quadrada. Nessa aproximação, u e v são escolhidos de forma aleatória a partir do interior de um círculo unitário, e então x=(u^2-v^2)/(u^2+v^2) e y=2uv/(u^2+v^2).

Function: void gsl_ran_dir_3d (const gsl_rng * r, double * x, double * y, double * z)

Essa função retorna um vetor de direção aleatório v = (x,y,z) em três dimensões. O vetor é normalizado de forma que |v|^2 = x^2 + y^2 + z^2 = 1. O método usado é devido a Robert E. Knop (CACM 13, 326 (1970)), e explicado em Knuth, v2, 3a. ed, p136. Usa o surpreendente fato de que a distribuição projetada ao longo de qualquer eixo é atualmente uniforme (isso é somente verdadeiro para 3 dimensões).

Function: void gsl_ran_dir_nd (const gsl_rng * r, size_t n, double * x)

Essa função retorna um vetor de direção aleatório v = (x_1,x_2,...,x_n) em n dimensões. O vetor é normalizado de forma que |v|^2 = x_1^2 + x_2^2 + ... + x_n^2 = 1. O método usa o fato de que uma distribuição de Gauss com vários conjuntos de variáveis é esfericamente simétrica. Cada componente é gerado para ter uma distribuição de Gauss, e então as componentes são normalizadas. O método é descrito por Knuth, v2, 3a. ed, p135–136, e atribuido a G. W. Brown, Modern Mathematics for the Engineer (1956).


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.24 A Distribuição de Weibull

Function: double gsl_ran_weibull (const gsl_rng * r, double a, double b)

Essa função retorna um conjunto de valores aleatórios a partir de uma distribuição de Weibull. A função de distribuição é,

p(x) dx = b

ab
xb−1 exp(−(x/a)b) dx
para x >= 0.

Function: double gsl_ran_weibull_pdf (double x, double a, double b)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição de Weibull com ajuste de proporcionalidade a e expoente b, usando a fórmula fornecida acima.


rand-weibull-pt_BR
Function: double gsl_cdf_weibull_P (double x, double a, double b)
Function: double gsl_cdf_weibull_Q (double x, double a, double b)
Function: double gsl_cdf_weibull_Pinv (double P, double a, double b)
Function: double gsl_cdf_weibull_Qinv (double Q, double a, double b)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição de Weibull com ajuste de proporcionalidade a e expoente b.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.25 A Distribuição de Gumbel Tipo-1

Function: double gsl_ran_gumbel1 (const gsl_rng * r, double a, double b)

Essa função retorna um conjunto de valores aleatórios a partir da distribuição de Gumbel do Tipo-1. A função da distribuição de Gumbel do Tipo-1 é,

p(x) dx = a b exp(−(b exp(−ax) + ax)) dx
for -\infty < x < \infty.

Function: double gsl_ran_gumbel1_pdf (double x, double a, double b)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição de Gumbel do Tipo-1 com parâmetros a e b, usando a fórmula fornecida acima.


rand-gumbel1-pt_BR
Function: double gsl_cdf_gumbel1_P (double x, double a, double b)
Function: double gsl_cdf_gumbel1_Q (double x, double a, double b)
Function: double gsl_cdf_gumbel1_Pinv (double P, double a, double b)
Function: double gsl_cdf_gumbel1_Qinv (double Q, double a, double b)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição de Gumbel do Tipo-1 com parâmetros a e b.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.26 A Distribuição de Gumbel Tipo-2

Function: double gsl_ran_gumbel2 (const gsl_rng * r, double a, double b)

Essa função retorna um conjunto de valores aleatórios a partir da distribuição de Gumbel do Tipo-2. A função da distribuição de Gumbel do Tipo-2 é,

p(x) dx = a b x−a−1 exp(−b x−a) dx
for 0 < x < \infty.

Function: double gsl_ran_gumbel2_pdf (double x, double a, double b)

Essa função calcula a densidade de probabilidade p(x) em x para uma distribuição de Gumbel do Tipo-2 com parâmetros a e b, usando a fórmula fornecida acima.


rand-gumbel2-pt_BR
Function: double gsl_cdf_gumbel2_P (double x, double a, double b)
Function: double gsl_cdf_gumbel2_Q (double x, double a, double b)
Function: double gsl_cdf_gumbel2_Pinv (double P, double a, double b)
Function: double gsl_cdf_gumbel2_Qinv (double Q, double a, double b)

Essas funções calculam as funções de distribuição acumulada P(x), Q(x) e suas inversas para a distribuição de Gumbel do Tipo-2 Gumbel com parâmetros a e b.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.27 A Distribuição de Derichlet

Function: void gsl_ran_dirichlet (const gsl_rng * r, size_t K, const double alpha[], double theta[])

Essa função retorna um vetor estático de K conjuntos de valores aleatórios a partir de uma distribuição de Dirichlet de ordem K-1. A função de distribuição é

p(θ1,…,θK)  dθ1 …dθK = 1

Z
K

i=1 
θiαi − 1   δ(1 − K

i=1 
θi) dθ1 …dθK
para theta_i >= 0 e alpha_i > 0. A função delta garante que \sum \theta_i = 1. O fator de normalização Z é
Z =
K

i=1 
Γ(αi)

Γ( K

i=1 
αi)

O conjunto de valores aleatórios são gerados por amostragem sobre K valores a partir de distribuições gama com parâmetros a=alpha_i, b=1, e renormalizando. Veja A.M. Law, W.D. Kelton, Simulation Modeling and Analysis (1991).

Function: double gsl_ran_dirichlet_pdf (size_t K, const double alpha[], const double theta[])

Essa função calcula a densidade de probabilidade p(\theta_1, ... , \theta_K) em theta[K] para uma distribuição de Dirichlet com parâmetros alpha[K], usando a fórmula fornecida acima.

Function: double gsl_ran_dirichlet_lnpdf (size_t K, const double alpha[], const double theta[])

Essa função calcula o logaritmo da densidade de probabilidade p(\theta_1, ... , \theta_K) para uma Dirichlet distribuição com parâmetros alpha[K].


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.28 Distribuições Gerais Discretas

Dados K eventos discretos com diferentes probabilidade P[k], produz um valor aleatório k consistente com sua probabilidade.

O caminho óbvio para fazer isso é pré-processar a lista de probabilidades gerando um vetor estático de probabilidade acumulada com K+1 elementos:

C[0]
= 0
C[k+1]
= C[k]+P[k].
Note que essa construção produz C[K]=1. Agora escolha um desvio uniforme u entre 0 e 1, e encontre o valor de k de forma que C[k] <= u < C[k+1]. Embora isso em princípio requeira passos da ordem de \log K por geração de números aleatórios, esses passos requeridos são rápidos, e se você usa algo como \lfloor uK \rfloor como ponto inicial, você pode muitas vezes fazer bastante bem.

Mas métodos mais rápidos teem sido desenvolvidos. Novamente, a idéia é pré-processar a lista de probabilidade, e gavar o resultado de slguma forma de tabela de consulta; então as chamadas individuais para um evento discreto aleatório pode ser feita rapidamente. Uma aproximação criada por G. Marsaglia (Generating discrete random variables in a computer, Comm ACM 6, 37–38 (1963)) é muito inteligente, e leitores interessados em exemplos de bom desenho de algoritmo são direcionados para esse curto e bem escrito artigo. Desafortunadamente, para grandes valores de K, a tabela de consulta de Marsaglia pode ser bastante grande.

Uma melhor aproximação é devida a Alastair J. Walker (An efficient method for generating discrete random variables with general distributions, ACM Trans on Mathematical Software 3, 253–256 (1977); veja também Knuth, v2, 3a. ed, p120–121,139). Requer duas tabelas de consulta, uma em ponto flutuante e uma inteira, mas ambas somente de tamanho K. Após pré-processar, os números aleatórios são gerados em tempo O(1), mesmo para grandes valores de K. O pré-processamento sugerido por Walker requer esforço O(K^2), mas que não é atualmente necessário, e a implementação fornecida aqui somente usa esforço O(K). Em geral, mais pré-processamento conduz a geração mais rápida de números aleatórios individuais, mas um diminuto retorno é alcançado no início. Knuth mostra que o pré-processamento ótimo é combinatorialmente difícil para grandes valores de K.

Esse método pode ser usado para aumentar a velocidade de alguns dos geradores de números aleatórios discretos abaixo, tais como a distribuição binomial. Usar esse método para alguma coisa como a Distribuição de Poisson, uma modificação pode ter que ser feita, uma vez que esse método somente pega um finito conjunto de K saídas.

Function: gsl_ran_discrete_t * gsl_ran_discrete_preproc (size_t K, const double * P)

Essa função retorna um apontador para uma estrutura que contém a tabela de consulta para o gerador de números aleatórios discreto. O vetor estático P[] contém as probabilidades dos eventos discretos; esses elementos de vetor estático devem todos serem positivos, mas eles não precisam serem acrescentados a um (de forma que você pode pensar neles mais geralmente como “pesos”)—o pré-processador irá normalizá-los apropriadamente. Esse valor de retorno é usado como um argumento para a função gsl_ran_discrete abaixo.

Function: size_t gsl_ran_discrete (const gsl_rng * r, const gsl_ran_discrete_t * g)

Após o pré-processador, acima, ter sido chamado, você usa essa função para pegar os números aleatórios discretos.

Function: double gsl_ran_discrete_pdf (size_t k, const gsl_ran_discrete_t * g)

Retorna a probabilidade P[k] de observar a variável k. Uma vez que P[k] não é armazenado como parte da tabela de consulta, deve ser recalculado; esse recálculo toma O(K), de forma que se K for muito grande e você garante que o vetor estático original P[k] usado para criar a tabela de consulta, então você deve apenas manter esse vetor estático original P[k] por perto.

Function: void gsl_ran_discrete_free (gsl_ran_discrete_t * g)

Desaloca a tabela de consulta apontada por g.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.29 A Distribuição de Poisson

Function: unsigned int gsl_ran_poisson (const gsl_rng * r, double mu)

Essa função retorna um inteiro aleatório a partir de uma distribuição de Poisson com média mu. A distribuição de probabilidade para um conjunto de valores de Poisson é,

p(k) = μk

k!
exp(−μ)
for k >= 0.

Function: double gsl_ran_poisson_pdf (unsigned int k, double mu)

Essa função calcula a probabilidade p(k) de obter k a partir de uma distribuição de Poisson com média mu, usando a fórmula fornecida acima.


rand-poisson-pt_BR
Function: double gsl_cdf_poisson_P (unsigned int k, double mu)
Function: double gsl_cdf_poisson_Q (unsigned int k, double mu)

Essas funções calculam as funções de distribuição acumulada P(k), Q(k) para a distribuição de Poisson com parâmetro mu.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.30 A Distribuição de Bernoulli

Function: unsigned int gsl_ran_bernoulli (const gsl_rng * r, double p)

Essa função retorna ou 0 ou 1, o resultado de um teste de Bernoulli com probabilidade p. A distribuição de probabilidade para um teste de Bernoulli é,

p(0)
= 1 − p
p(1)
= p

Function: double gsl_ran_bernoulli_pdf (unsigned int k, double p)

Essa função calcula a probabilidade p(k) de obter k a partir de uma distribuição de Bernoulli com parâmetro de probabilidade p, usando a fórmula fornecida acima.


rand-bernoulli-pt_BR

[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.31 A Distribuição Binomial

Function: unsigned int gsl_ran_binomial (const gsl_rng * r, double p, unsigned int n)

Essa função retorna um inteiro aleatório a partir da distribuição binomial, o número de sucessos em n testes independentes com probabilidade p. A distribuição de probabilidade para um conjunto de valores binomiais é,

p(k) = n!

k! (n−k)!
pk (1−p)n−k
para 0 <= k <= n.

Function: double gsl_ran_binomial_pdf (unsigned int k, double p, unsigned int n)

Essa função calcula a probabilidade p(k) de obter k a partir de uma distribuição binomial com parâmetros p e n, usando a fórmula fornecida acima.


rand-binomial-pt_BR
Function: double gsl_cdf_binomial_P (unsigned int k, double p, unsigned int n)
Function: double gsl_cdf_binomial_Q (unsigned int k, double p, unsigned int n)

Essas funções calculam as funções de distribuição acumulada P(k), Q(k) para a distribuição binomial com parâmetros p e n.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.32 A Distribuição Multinomial

Function: void gsl_ran_multinomial (const gsl_rng * r, size_t K, unsigned int N, const double p[], unsigned int n[])

Essa função calcula uma aostra aleatória n[] a partir da distribuição multinomial formada por N testes a partir de um distribuição básica p[K]. A função de distribuição para n[] é,

P(n1, n2,…, nK) = N!

n1 ! n2 ! …nK !
  p1n1 p2n2 …pKnK
onde (n_1, n_2, ..., n_K) são inteiros não negativos com sum_{k=1}^K n_k = N, e (p_1, p_2, ..., p_K) é uma distribuição de probabilidade com \sum p_i = 1. Se o vetor estático p[K] não form normalizado então suas entradas irão ser tratadas como pesos e normalizadas apropriadamentes. Os vetores estáticos n[] e p[] devem ser ambos de comprimento K.

Conjunto de valores aleatórios são gerados usando o método condicional binomial (veja C.S. Davis, The computer generation of multinomial random variates, Comp. Stat. Data Anal. 16 (1993) 205–217 para detalhes).

Function: double gsl_ran_multinomial_pdf (size_t K, const double p[], const unsigned int n[])

Essa função calcula a probabilidade P(n_1, n_2, ..., n_K) de amostragem n[K] a partir de uma distribuição multinomial com parâmetros p[K], usando a fórmula fornecida acima.

Function: double gsl_ran_multinomial_lnpdf (size_t K, const double p[], const unsigned int n[])

Essa função retorna o logaritmo da probabilidade para a distribuição multinomial P(n_1, n_2, ..., n_K) com parâmetros p[K].


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.33 A Distriuição Binomial Negativa

Function: unsigned int gsl_ran_negative_binomial (const gsl_rng * r, double p, double n)

Essa função retorna um inteiro aleatório a partir da distribuição binomial negativa, o número de falhas ocorridas antes de n sucessos em testes independentes com probabilidade p de sucessos. A distribuição de probabilidade para conjunto de valores binomiais negativos é,

p(k) = Γ(n + k)

Γ(k+1) Γ(n)
pn (1−p)k
Note que n não é obrigatóriamente um inteiro.

Function: double gsl_ran_negative_binomial_pdf (unsigned int k, double p, double n)

Essa função calcula a probabilidade p(k) de obter k a partir de uma distribuição binomial negativa com parâmetros p e n, usando a fórmula fornecida acima.


rand-nbinomial-pt_BR
Function: double gsl_cdf_negative_binomial_P (unsigned int k, double p, double n)
Function: double gsl_cdf_negative_binomial_Q (unsigned int k, double p, double n)

Essas funções calculam as funções de distribuição acumulada P(k), Q(k) para a distribuição binomial negativa com parameters p e n.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.34 A Distribuição de Pascal

Function: unsigned int gsl_ran_pascal (const gsl_rng * r, double p, unsigned int n)

Essa função retorna um inteiro aleatório a partir da distribuição de Pascal. A distribuição de Pascal é simplesmente uma distribuição binomial negativa com um valor inteiro de n.

p(k) = (n + k − 1)!

k! (n − 1)!
pn (1−p)k
for k >= 0

Function: double gsl_ran_pascal_pdf (unsigned int k, double p, unsigned int n)

Essa função calcula a probabilidade p(k) de obter k a partir de uma distribuição de Pascal com parâmetros p e n, usando a fórmula fornecida acima.


rand-pascal-pt_BR
Function: double gsl_cdf_pascal_P (unsigned int k, double p, unsigned int n)
Function: double gsl_cdf_pascal_Q (unsigned int k, double p, unsigned int n)

Essas funções calculam as funções de distribuição acumulada P(k), Q(k) para a distribuição de Pascal com parâmetros p e n.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.35 A Distribuição Geométrica

Function: unsigned int gsl_ran_geometric (const gsl_rng * r, double p)

Essa função retorna um inteiro aleatório a partir da distribuição geométrica, o número de testes independentes com probabilidade p até que ocorra o primeiro sucesso. A distribuição de probabilidade para o conjunto de valores geométricos é,

p(k) = p (1−p)k−1
para k >= 1. Note que a distribuição inicia-se com k=1 com essa definição. Existe outra convenção na qual o expoente k-1 é substituído por k.

Function: double gsl_ran_geometric_pdf (unsigned int k, double p)

Essa função calcula a probabilidade p(k) de obter k a partir de uma distribuição geométrica com parâmetro de probabilidade p, usando a fórmula fornecida acima.


rand-geometric-pt_BR
Function: double gsl_cdf_geometric_P (unsigned int k, double p)
Function: double gsl_cdf_geometric_Q (unsigned int k, double p)

Essas funções calculam as funções de distribuição acumulada P(k), Q(k) para a distribuição geométrica com parâmetro p.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.36 A Distribuição Hipergeométrica

Function: unsigned int gsl_ran_hypergeometric (const gsl_rng * r, unsigned int n1, unsigned int n2, unsigned int t)

Essa função retorna um inteiro aleatório a partir da distribuição hipergeométrica. A distribuição de probabilidade para conjunto de valores aleatórios hipergeométricos é,

p(k) = C(n1, k) C(n2, t − k) / C(n1 + n2, t)
onde C(a,b) = a!/(b!(a-b)!) e t <= n_1 + n_2. O domínio de k é max(0,t-n_2), ..., min(t,n_1).

Se uma população contém n_1 elementos do “tipo 1” e n_2 elementos do “tipo 2” então a distribuição hipergeométrica fornece a probabilidade de obter k elementos do “tipo 1” em t amostras a partir da população sem substituição.

Function: double gsl_ran_hypergeometric_pdf (unsigned int k, unsigned int n1, unsigned int n2, unsigned int t)

Essa função calcula a probabilidade p(k) de obter k a partir de uma distribuição hipergeométrica com parâmetros n1, n2, t, usando a fórmula fornecida acima.


rand-hypergeometric-pt_BR
Function: double gsl_cdf_hypergeometric_P (unsigned int k, unsigned int n1, unsigned int n2, unsigned int t)
Function: double gsl_cdf_hypergeometric_Q (unsigned int k, unsigned int n1, unsigned int n2, unsigned int t)

Essas funções calculam as funções de distribuição acumulada P(k), Q(k) para a distribuição hipergeométrica com parâmetros n1, n2 e t.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.37 A Distribuição Logaritmica

Function: unsigned int gsl_ran_logarithmic (const gsl_rng * r, double p)

Essa função retorna um inteiro aleatório a partir da distribuição logarítmica. A distribuição de probabilidade para conjuntos de valores aleatórios logarítmicos é,

p(k) = −1

log(1−p)

pk

k

para k >= 1.

Function: double gsl_ran_logarithmic_pdf (unsigned int k, double p)

Essa função calcula a probabilidade p(k) de obter k from a distribuição logarítmica com parâmetro de probabilidade p, usando a fórmula fornecida acima.


rand-logarithmic-pt_BR

[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.38 Misturando e Retirando Amostras

As seguintes funções permitem o embaralhamento e amostragem de um conjunto de objetos. Os algoritmos com certeza usam um gerador de números aleatórios como uma fonte de aleatoriedade e um gerador de baixa qualidade pode levar a correlações na saída. Em particular é importante evitar geradores com períodos curtos. Para mais informação veja, v2, 3a. ed, Seção 3.4.2, “Random Sampling and Shuffling”.

Function: void gsl_ran_shuffle (const gsl_rng * r, void * base, size_t n, size_t size)

Essa função embaralha aleatoriamente a ordem de n objetos, cada um de tamanho size, armazenados no vetor estático base[0..n-1]. A saída do gerador de números aleatórios r é usada para produzir a permutação. O algoritmo gera todas as possíveis n! permutações com igual probabilidade, assumindo uma fonte perfeita de números aleatórios.

O seguinte código mostra como embaralhar os números de 0 a 51,

int a[52];

for (i = 0; i < 52; i++)
  {
    a[i] = i;
  }

gsl_ran_shuffle (r, a, 52, sizeof (int));
Function: int gsl_ran_choose (const gsl_rng * r, void * dest, size_t k, void * src, size_t n, size_t size)

Essa função preenche o vetor estático dest[k] com k objetos tomados aleatoriamente a partir de n elementos do vetor estático src[0..n-1]. Os objetos são cada um de tamanho size. A saída do gerador de números aleatórios r é usada para fazer a seleção. O algoritmo garante que todas as possíveis amostras são igualmente prováveis, assumindo uma perfeita fonte de aleatoriedade.

Os objetos são retirados para fazerem parte da amostra sem substituição, dessa forma cada objeto pode somente aparecer uma vez em dest[k]. É obrigatório que k seja menor que ou igual a n. Os objetos em dest irão estar na mesma ordem relativa daqueles em src. Você irá precisar chamar gsl_ran_shuffle(r, dest, n, size) se você desejar aleatorizar a ordem.

O seguinte código mostra como selecionar uma amostr aleatória de três números únicos a aprtir do conjunto de 0 a 99,

double a[3], b[100];

for (i = 0; i < 100; i++)
  {
    b[i] = (double) i;
  }

gsl_ran_choose (r, a, 3, b, 100, sizeof (double));
Function: void gsl_ran_sample (const gsl_rng * r, void * dest, size_t k, void * src, size_t n, size_t size)

Essa função é como a gsl_ran_choose mas faz amostras de k itens a partir do vetor estático original de n itens src com substituição, de forma que o mesmo objeto pode aparecer mais que uma vez na sequência de saída dest. Não existe obrigatoriedade que k seja menor que n nesse caso.


[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.39 Exemplos

O seguinte programa demonstra o uso de um gerador de números aleatórios para produzir um conjunto de números a partir de uma distribuição. Exibe 10 amostras a partir da distribuição de Poisson com média 3.

#include <stdio.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>

int
main (void)
{
  const gsl_rng_type * T;
  gsl_rng * r;

  int i, n = 10;
  double mu = 3.0;

  /* create a generator chosen by the 
     environment variable GSL_RNG_TYPE */

  gsl_rng_env_setup();

  T = gsl_rng_default;
  r = gsl_rng_alloc (T);

  /* print n random variates chosen from 
     the poisson distribution with mean 
     parameter mu */

  for (i = 0; i < n; i++) 
    {
      unsigned int k = gsl_ran_poisson (r, mu);
      printf (" %u", k);
    }

  printf ("\n");
  gsl_rng_free (r);
  return 0;
}

Se a biblioteca e arquivos de cabeçalho são instalados em ‘/usr/local’ (a localização padrão) então o programa pode ser compilado com essas opções,

$ gcc -Wall demo.c -lgsl -lgslcblas -lm

Aqui está a saída do programa,

$ ./a.out 
 2 5 5 2 1 0 3 4 1 1

O conjunto de valores depende da semente usada pelo gerador. A semente para o tipo de gerador padrão gsl_rng_default pode ser mudada com a variável de ambiente GSL_RNG_SEED para produzir um fluxo diferente de conjunto de valores,

$ GSL_RNG_SEED=123 ./a.out 
GSL_RNG_SEED=123
 4 5 6 3 3 1 4 2 5 5

O seguinte programa gera uma caminhada aleatória em duas dimensões.

#include <stdio.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>

int
main (void)
{
  int i;
  double x = 0, y = 0, dx, dy;

  const gsl_rng_type * T;
  gsl_rng * r;

  gsl_rng_env_setup();
  T = gsl_rng_default;
  r = gsl_rng_alloc (T);

  printf ("%g %g\n", x, y);

  for (i = 0; i < 10; i++)
    {
      gsl_ran_dir_2d (r, &dx, &dy);
      x += dx; y += dy; 
      printf ("%g %g\n", x, y);
    }

  gsl_rng_free (r);
  return 0;
}

Aqui está uma saída do programa, quatro caminhadas aleatórias de 10 passos a partir da orígem,

random-walk-pt_BR

O seguinte programa calcula as funções de distribuição acumuladas alta e baixa para a distribuição normal padrão em x=2.

#include <stdio.h>
#include <gsl/gsl_cdf.h>

int
main (void)
{
  double P, Q;
  double x = 2.0;

  P = gsl_cdf_ugaussian_P (x);
  printf ("prob(x < %f) = %f\n", x, P);

  Q = gsl_cdf_ugaussian_Q (x);
  printf ("prob(x > %f) = %f\n", x, Q);

  x = gsl_cdf_ugaussian_Pinv (P);
  printf ("Pinv(%f) = %f\n", P, x);

  x = gsl_cdf_ugaussian_Qinv (Q);
  printf ("Qinv(%f) = %f\n", Q, x);

  return 0;
}

Aqui está a saída do programa,

prob(x < 2.000000) = 0.977250
prob(x > 2.000000) = 0.022750
Pinv(0.977250) = 2.000000
Qinv(0.022750) = 2.000000

[ << ] [ < ] [ Acima ] [ > ] [ >> ]         [Topo] [Conteúdo] [Índice] [ ? ]

20.40 Referências e Leituras Adicionais

Para uma abrangência enciclopédica dos leitores do assunto é aconselhado consultar o livro Non-Uniform Random Variate Generation de Luc Devroye. O livro abrange toda distribuição imaginável e fornece centenas de algoritmos.

O assunto de geração de conjuntos de valores aleatórios é também revisado por Knuth, que descreve algoritmos para todas as principais distribuiçẽos.

O Grupo de Dados de Particulas fornece uma curta revisão de técnicas para gerar distribuiçẽos de números aleatórios na seção “Monte Carlo” de seu Annual Review of Particle Physics.

O Review of Particle Physics está disponível online nos formatos postscript e pdf.

Uma visão geral de métodos usados para calcular funções de distribuição acumulada pode ser encontrado em Statistical Computing por W.J. Kennedy e J.E. Gentle. Outra referência geral é Elements of Statistical Computing por R.A. Thisted.

As funções de distribuições acumuladas para a distribuição de Gauss são baseados nos seguintes artigos,


[ << ] [ >> ]           [Topo] [Conteúdo] [Índice] [ ? ]

Esse documento foi gerado em 23 de Julho de 2013 usando texi2html 5.0.