Escolar Documentos
Profissional Documentos
Cultura Documentos
=120
Podemos observar na planilha que para cada seqencia ou seja, rolamento novo,
gerado um nmero aleatrio que indica qual a vida til daquela rolamento. Tendo
quebrado, aps esta vida til, o mecnico chamado e um 2
o
nmero aleatrio
gerado para definir o tempo de espera at a troca do rolamento ser iniciada.
Quando a vida acumulada ultrapassa 20.000 horas, ou seja a durao da simulao,
paramos a execuo do processo.
Processos semelhantes foram executados para os outros 2 rolamentos, como visto a
seguir.
1
A simulao foi realizada utilizando-se a planilha EXCEL
10 Introduo Simulao
R O L A M E N T O 2
Vida Vida Acumulada Espera
Seqencia N
o
Aleatrio (Horas) (Horas) N
o
Aleatrio (Min)
1 89 1.700 1.700 58 5
2 47 1.200 2.900 88 10
3 60 1.300 4.200 20 5
4 3 1.000 5.200 98 15
5 40 1.200 6.400 26 5
6 64 1.400 7.800 97 15
7 9 1.000 8.800 41 5
8 30 1.200 10.000 79 10
9 32 1.200 11.200 0 5
10 8 1.000 12.200 3 5
11 94 1.800 14.000 58 5
12 66 1.400 15.400 84 10
13 53 1.300 16.700 61 10
14 17 1.100 17.800 43 5
15 72 1.500 19.300 15 5
16 0 1.000 20.300 97 15
= 130
R O L A M E N T O 3
Vida Vida Acumulada Espera
Seqencia N
o
Aleatrio (Horas) (Horas) N
o
Aleatrio (Min)
1 49 1.300 1.300 44 5
2 26 1.200 2.500 45 5
3 2 1.000 3.500 72 10
4 83 1.600 5.100 87 10
5 21 1.100 6.200 19 5
6 20 1.100 7.300 81 10
7 60 1.300 8.600 56 5
8 34 1.200 9.800 74 10
9 63 1.400 11.200 93 15
10 69 1.400 12.600 36 5
11 44 1.200 13.800 71 10
12 76 1.500 15.300 97 15
13 55 1.300 16.600 59 5
14 85 1.700 18.300 81 10
15 21 1.100 19.400 21 5
16 5 1.000 20.400 1 5
=130
1.7 Exemplos de modelos de Simulao 11
Com os dados obtidos na simulao, podemos calcular o custo da situao atual:
Custo dos rolamentos = (15 + 16 + 16) $16 = $752
Custo da espera pelo mecnico = (120 + 130 + 130) $5 = $1.900
Custo da mquina parada = (15 + 16 + 16) 20 $5 = $4.700
Custo do mecnico = (15 + 16 + 16) 20 $0.20 = $188
Custo Total = 752 + 1.900 + 4.700 + 188 = $7.540
A simulao da situao proposta apresentou os seguintes resultados:
ROL. 1 ROL. 2 ROL. 3
Vida Vida Vida 1
a
Vida ESPERA
Seq. NA hr NA (hr) NA (hr) Quebra Acum. NA (Min)
1 96 1.900 2 1.000 34 1.200 1.000 1.000 21 5
2 70 1.500 7 1.000 47 1.200 1.000 2.000 36 5
3 96 1.900 46 1.200 49 1.300 1.200 3.200 21 5
4 48 1.300 17 1.100 42 1.200 1.100 4.300 7 5
5 32 1.200 93 1.800 20 1.100 1.100 5.400 58 5
6 36 1.200 94 1.800 98 1.900 1.200 6.600 83 10
7 41 1.200 17 1.100 53 1.300 1.100 7.700 14 5
8 71 1.500 2 1.000 20 1.100 1.000 8.700 75 10
9 4 1.000 22 1.100 86 1.700 1.000 9.700 5 5
10 69 1.400 21 1.100 0 1.000 1.000 10.700 65 10
11 13 1.100 89 1.700 58 1.300 1.100 11.800 15 5
12 36 1.200 12 1.100 66 1.400 1.100 12.900 12 5
13 75 1.500 57 1.300 29 1.200 1.200 14.100 32 5
14 76 1.500 78 1.500 95 1.900 1.500 15.600 2 5
15 71 1.500 5 1.000 86 1.700 1.000 16.600 31 5
16 98 1.900 43 1.200 22 1.100 1.100 17.700 51 5
17 98 1.900 47 1.200 60 1.300 1.200 18.900 20 5
18 68 1.400 61 1.400 57 1.300 1.300 20.200 35 5
=105
NA = N
o
aleatrio
Feita a simulao da situao proposta, podemos calcular os custos:
Custo dos rolamentos = (18 3) $ 16 = $864
Custo da espera pelo mecnico = 105 $5 = $525
Custo da mquina parada = 18 40 $5 = $3.600
Custo do mecnico = 18 40 $0.20 = $144
Custo Total = 864 + 525 + 3.600 + 144 = $5.133
Assim a simulao
2
nos mostrou que a situao proposta bem melhor em termos
econmicos.
2
Para ser, estatisticamente confivel, as simulaes acima teriam que ser realizadas (replicadas)
muitas vezes e a avaliao econmica calculada com a mdia dos resultados.
12 Introduo Simulao
1.7.2 Fila com uma estao de servio
Uma loja tem somente 1 atendente. Os fregueses chegam aleatoriamente com in-
tervalo, entre eles, variando de 1 a 8 minutos. Cada valor possvel do intervalo
entre chegadas tem a mesma probabilidade de ocorrncia, como mostrado na ta-
bela a seguir:
Tempo entre chegadas (minutos) Probabilidade
1 0.125
2 0.125
3 0.125
4 0.125
5 0.125
6 0.125
7 0.125
8 0.125
A durao do atendimento aos clientes varia de 1 a 6 minutos com probabilidades
mostradas na tabela a seguir:
Durac, o do servic, o (minutos) Probabilidade
1 0.10
2 0.20
3 0.30
4 0.25
5 0.10
6 0.05
Como no exemplo anterior, temos que construir tabelas relacionando as probabili-
dades com nmeros aleatrios gerados:
Tempo entre Probabilidade N
o
Aleatrio
chegadas (min) Probabilidade Acumulada Atribudo
1 0.125 0.125 000 124
2 0.125 0.250 125 249
3 0.125 0.375 250 374
4 0.125 0.500 375 499
5 0.125 0.625 500 624
6 0.125 0.750 625 749
7 0.125 0.875 750 874
8 0.125 1.000 875 999
1.7 Exemplos de modelos de Simulao 13
Durac, o do Probabilidade N
o
Aleatrio
servic, o (min) Probabilidade Acumulada Atribudo
1 0.10 0.10 0 9
2 0.20 0.30 10 29
3 0.30 0.60 30 59
4 0.25 0.85 60 84
5 0.10 0.95 85 94
6 0.05 1.00 95 99
A simulao para os primeiros 20 clientes apresentou os seguintes resultados:
Intervalo entre Instante Durac, o Incio Espera Fim do Tempo total Tempo ocioso
NA chegadas(min) chegada NA servic, o servic, o fila servic, o na loja(min) atendente(min)
1 0 84 4 0 0 4 4 0
2 913 8 8 9 1 8 0 9 1 4
3 727 6 14 74 4 14 0 18 4 5
4 15 1 15 53 3 18 3 21 6 0
5 948 8 23 17 2 23 0 25 2 2
6 309 3 26 79 4 26 0 30 4 1
7 922 8 34 91 5 34 0 39 5 4
8 753 7 41 67 4 41 0 45 4 2
9 235 2 43 89 5 45 2 50 7 0
10 302 3 46 38 3 50 4 53 7 0
11 109 1 47 32 3 53 6 56 9 0
12 93 1 48 94 5 56 8 61 13 0
13 607 5 53 79 4 61 8 65 12 0
14 738 6 59 5 1 65 6 66 7 0
15 359 3 62 79 5 66 4 71 9 0
16 888 8 70 84 4 71 1 75 5 0
17 108 1 71 52 3 75 4 78 7 0
18 212 2 73 55 3 78 5 81 8 0
19 493 4 77 30 2 81 4 83 6 0
20 535 5 82 50 3 83 1 86 4 0
= 68 56 124 18
Podemos, a partir da simulao, inferir alguns resultados:
O tempo de espera mdio de um cliente foi de 2,8 minutos. Este valor encontrado
de :
Tempo mdio de espera (min) =
Tempo total dos clientes na fila (min)
Nmero total de clientes
=
56
20
= 2, 8 minutos
A probabilidade de que um cliente tenha que esperar na fila 65%. Isto vem de:
Probabilidade(espera) =
Nmero de clientes que esperaram
Nmero total de clientes
=
13
20
= 0, 65
14 Introduo Simulao
A proporo de tempo que o atendente fica ocioso 21%. Vem de:
Prob. do atendente estar ocioso =
Tempo total de ociosidade (min)
Durao da Simulao
=
18
86
= 0.21
O atendente est ocupado 100 21 = 79% do tempo.
O tempo de servio mdio de 3.4 minutos. Podemos obt-lo de:
Tempo de servio mdio (min) =
Durao total do servio
Nmero total de clientes
=
68
20
= 3.4 minutos
Este resultado pode ser comparado com o tempo de servio esperado achando-se a
mdia da distribuio do tempo de servio usando a equao:
E(s) =
s=0
sp(s)
Temos ento:
1(0.10) + 2(0.20) + 3(0.30) + 4(0.25) + 5(0.10) + 6(0.05) = 3.2 minutos
O resultado da simulao um pouco maior porque o tamanho da simulao foi
pequeno. Quanto maior a durao da simulao mais o resultado se aproximar de
3.2 minutos.
Algum que fosse tomar decises estaria interessado nos resultados obtidos acima.
Obviamente seria necessrio uma simulao mais demorada para se conseguir re-
sultados mais precisos.
Entretanto, algumas inferncias podem ser obtidas: A maioria dos clientes tem que
esperar mas a espera no excessiva. O atendente no fica muito tempo ocioso.
O objetivo a ser alcanado vai depender do balano entre o custo de espera e o custo
de se colocar mais atendentes.
Captulo 2
A gerao de Nmeros Aleatrios
Pudemos reparar nos exemplos acima que a chave para simular eventos aleatrios
discretos a gerao de nmeros aleatrios. Como se usa o computador para fazer
a simulao, precisamos de mtodos rpidos e eficientes para ger-los.
Os nmeros aleatrios, gerados em computador, no so realmente aleatrios
pois veremos mais adiante que eles so gerados em seqncias que podem ser
reproduzidas, o que viola o princpio bsico da aleatoriedade.
Como contornar este fato ? Se os nmeros passam por uma srie de testes
estatsticos de aleatoriedade ento, para efeitos prticos, podemos consider-
los como se fossem realmente aleatrios.
Por este fato eles so conhecidos como nmeros Pseudo-aleatrios. comum se
usar, em simulao, a expresso nmeros aleatrios mas considere isto, sempre,
como um sinnimo de nmeros pseudo-aleatrios.
2.1 Propriedades desejveis de um gerador de nmeros ale-
atrios
Um gerador de nmeros aleatrios deveria possuir todas as caractersticas abaixo:
1. Aleatoriedade
essencial que a seqncia gerada exiba as propriedades dos nmeros ver-
dadeiramente aleatrios. Este comportamento aleatrio deve ser confirmado
por testes estatsticos.
2. Grande Perodo
Todos os geradores de nmeros aleatrios so baseados no uso de frmulas
determinsticas precisas. Estas frmulas fazem com que, a partir de um va-
lor inicial chamado semente, seja gerada uma srie de nmeros aleatrios
(pseudo-aleatrios). Em um determinado ponto da srie, voltamos a semente
e como a srie gerada por uma frmula, a srie, obviamente, se repete.
A quantidade de nmeros gerados at a seqencia comear a se repetir cha-
mada de Perodo.
16 A gerao de Nmeros Aleatrios
Sempre desejamos o maior perodo possvel. Para propsitos prticos o pe-
rodo deve ser, no mnimo, grande o suficiente para no se repetir durante
uma simulao.
3. Eficincia Computacional
Desde que um estudo de simulao necessita de que um grande nmero de
variveis aleatrias sejam geradas, o gerador de nmeros aleatrios deve ge-
rar estes nmeros gastando o mnimo de tempo de computador. Alm disto
o gerador no deve usar muita memria. Com a evoluo dos computadores
esta ltima propriedade est perdendo um pouco de sua importncia.
2.2 Mtodos para a gerao de nmeros aleatrios
2.2.1 Mtodo dos quadrados mdios
Um dos primeiros mtodos de gerao de nmeros aleatrios foi o chamado Mtodo
dos Quadrados Mdios. Este mtodo foi desenvolvido por John Von Neumann na
dcada de 40. A tcnica comea com um nmero inicial chamado de semente. O n-
mero ento elevado ao quadrado e os dgitos do meio do nmero gerado formam o
prximo nmero da seqncia. Este segundo nmero ento elevado ao quadrado
e os nmeros do meio do nmero gerado so o prximo nmero da seqncia e as-
sim por diante...
Exemplo: Gerar uma seqncia de nmeros aleatrios de 4 dgitos. Seja 3187 a
semente normalmente rotulada como x
0
.
x
0
= 3187
(3187)
2
= 10 | 1569 | 69 x
1
= 1569
(1569)
2
= 02 | 4617 | 61 x
2
= 4617
(4617)
2
= 21 | 3166 | 89 x
3
= 3166
(3166)
2
= 10 | 0235 | 56 x
4
= 235
(235)
2
= 00 | 0552 | 25 x
5
= 552
(552)
2
= 00 | 3047 | 04 x
6
= 3047
e assim por diante...
Este mtodo apresenta 2 problemas srios: normalmente os perodos so curtos e
se o n
o
gerado 0, o mtodo s apresenta zero!
Exemplo: Gerar, pelo mtodo dos quadrados mdios, nmeros pseudo aleatrios de
2 dgitos tendo 44 como semente.
x
0
= 44
(44)
2
= 1 | 93 | 6 x
1
= 93
(93)
2
= 8 | 64 | 9 x
2
= 64
(64)
2
= 4 | 09 | 6 x
3
= 9
(9)
2
= 0 | 08 | 1 x
4
= 8
(8)
2
= 0 | 06 | 4 x
5
= 6
(6)
2
= 0 | 03 | 6 x
6
= 3
(3)
2
= 0 | 00 | 9 x
7
= 0
(0)
2
= 0 | 00 | 0 x
8
= 0
2.2 Mtodos para a gerao de nmeros aleatrios 17
2.2.2 Mtodos Congruentes
Amaioria dos mtodos usados hoje emdia so variaes do chamado Mtodo Congru-
ente Linear, cujos pontos bsicos foram propostos por Lehmer em 1951. Neste
mtodo os nmeros aleatrios, gerados sucessivamente, so obtidos da relao re-
cursiva:
x
n+1
= (ax
n
+c) mod m
A funo z mod t d o resto inteiro da diviso de z por t (ex. 23 mod 5 = 3).
A constante a chamada de multiplicador, a constante c o incremento e m o
mdulo. Como antes, x
0
a semente.
Quando c = 0, o mtodo chamado de Congruncia Multiplicativa.
O Mtodo da Congruncia Linear (c = 0), por gerar nmeros aleatrios que ten-
dem a ter mais dificuldades em passar nos testes estatsticos de aleatoriedade dos
que os gerados pelo mtodo da Congruncia Multiplicativa (c = 0), no , pratica-
mente, mais usado hoje em dia.
Exemplo: Gerar nmeros aleatrios, usando o mtodo congruente multiplicativo,
tendo os seguintes valores: x
0
= 3 , a = 2 e m = 10.
x
0
= 3
x
1
= (2 3) mod 10 = 6
x
2
= (2 6) mod 10 = 2
x
3
= (2 2) mod 10 = 4
x
4
= (2 4) mod 10 = 8
x
5
= (2 8) mod 10 = 6
Como podemos observar o perodo desta gerao foi muito curto (=4).
Ficou claro tambm, neste pequeno exemplo, que o nmero aleatrio gerado o
resto inteiro da diviso por m, ou seja um nmero inteiro entre 0 e (m1).
Neste ponto devemos esclarecer que a frmula congruente necessria para se
gerar nmeros aleatrios, mas no suficiente. A seleo dos valores de a, c, m e x
0
afeta drasticamente as propriedades estatsticas da gerao bem como o tamanho
do perodo.
Vrios estudos levaram ao estabelecimento de algumas regras bsicas que devem
ser observadas na gerao de nmeros aleatrios, quando se utiliza um mtodo
congruente:
1. Como o n
o
aleatrio gerado o resto da diviso por mele s pode ficar entre 0
e (m1). Logo uma regra bsica inicial que m seja o maior possvel.
2. Para m = 2
b
e c = 0, o perodo mais longo possvel P = m 4 = 2
b2
,
que obtido fazendo-se x
0
mpar e a = 3 + 8k ou a = 5 + 8k para algum
k = 0, 1, ...
3. Para m, um nmero primo, e c = 0, o perodo mais longo possvel P =
m 1, que obtido fazendo-se a de tal modo que o menor inteiro k para o
qual (a
k
1) seja divisvel por m, seja k = m1.
18 A gerao de Nmeros Aleatrios
Exemplo:
Usando o Mtodo Congruente Multiplicativo, ache o perodo para o gerador onde
a = 13, m = 2
6
= 64 e x
0
= 1, 2, 3 e 4.
A soluo est dada na tabela a seguir:
i x
i
x
i
x
i
x
i
0 1 2 3 4
1 13 26 39 52
2 41 18 59 36
3 21 42 63 20
4 17 34 51 4
5 29 58 23
6 57 50 43
7 37 10 47
8 33 2 35
9 45 7
10 9 27
11 53 31
12 49 19
13 61 55
14 25 11
15 5 15
16 1 3
Pelo tem 2 o perodo mximo seria P = m 4 = 16. Este perodo s seria en-
contrado no caso de que x
0
fosse mpar, como o caso para x
0
= 1 e x
0
= 3. Para
sementes pares, o perodo fica bastante reduzido.
Observe que a = 13 ou seja da forma 5 + 8k, com k = 1.
Um outro exemplo poderia ser feito com a = 13, m = 67, x
0
= 1.
Estes nmeros se enquadram na 3
a
regra acima pois o menor inteiro (k) que faz
com que 13
k
1 seja divisvel por 67(m), 66. Logo o perodo deve ser igual a
m1 = 66.
Aplicando-se a congruncia temos:
x
0
= 1
x
1
= 13
x
2
= 35
.
.
.
x
65
= 31
x
66
= 1, o que confirma a teoria.
Estes exemplos simples, serviram para ilustrar as propriedades a que devem obe-
decer x
0
, a e m nos mtodos congruentes.
2.3 Eficincia Computacional 19
2.3 Eficincia Computacional
Um fator que tambm tem que ser levado em conta nos geradores de nmeros ale-
atrios a sua velocidade e eficincia computacional.
Para isto os geradores usam como mdulo (m) uma potncia de 2 (m = 2
b
) pois os
computadores trabalham na base 2.
A grande vantagem que isto traz que o resultado da operao (ax
i
) mod m pode
ser feita simplesmente desprezando-se os bs algarismos mais a esquerda do resul-
tado do produto ax
i
, ou seja acha-se o resto da diviso sem dividir.
Para exemplificar vamos ver um exemplo trabalhando com a base 10 a qual esta-
mos mais acostumados.
Seja m = 10
2
= 100(ou seja, b = 2), a = 19 e x
0
= 63.
x
0
= 63
x
1
= 19 63 mod 100 = 1197 mod 100 = desprezando os 2 (= b) algarismos
mais a esquerda = 97
x
2
= 19 97 mod 100 = 1843 mod 100 = 43
x
3
= 19 43 mod 100 = 0817 mod 100 = 17
.
.
.
Na verdade os geradores de nmeros aleatrios usam os mais diversos artifcios
computacionais para serem geis e ocuparem pouca memria.
2.4 Nmeros Aleatrios uniformemente distribudos em[0,1)
Todos os exemplos que vimos at agora geraram nos aleatrios distribudos entre
0 e m 1. No exemplo acima os nmeros podero estar entre 0 e 99, pois sero o
resto inteiro da diviso por 100.
Isto verdade para qualquer mtodo de gerao de nos aleatrios: Eles geram
nmeros inteiros no intervalo [0, m1).
Como veremos mais adiante, todo gerador de nmeros aleatrios divide o nmero
gerado por m. Desta forma o que se obtm uma distribuio uniforme distribuda
em [0,1).
Assim, por exemplo, para a = 13, m = 67 e x
0
= 1, teramos:
x
0
= 1 67 = 0.0149253
x
1
= (13 1) mod 67 = 13 67 = 0.1940298
x
2
= (13 13) mod 67 = 35 67 = 0.522388
x
3
= (13 35) mod 67 = 53 67 = 0.7910447
.
.
.
Alguns geradores dividem por m1 o que d uma distribuio [0, 1]. Na verdade
como m sempre um nmero muito grande, dividir por mou (m1) irrelevante.
20 A gerao de Nmeros Aleatrios
2.5 O gerador RANDU e a formao de trelias
O mtodo da congruncia multiplicativa pode facilmente ser implementado em lin-
guagens de programao como Fortran, Pascal, Basic, etc..., por exemplo.
Um gerador, chamado de RANDU, foi desenvolvido pela IBM e durante quase 20
anos foi usado por praticamente todos os modelos de simulao nas dcadas de 60
e 70.
A RANDU utilizava os valores a = 65.539 e m = 2
31
= 2.147.483.648, ou seja
x
n+1
= (65539 x
n
) MOD2147483648
A funo, codificada em Pascal
1
a seguinte: (a rotina original era em Fortran)
IX: Longint ;
Function RANDU(KX: Integer ) : Real ;
Var
IY: Longint ;
Begin
If KX <> 0 Then IX : = KX;
IY : = 65539 IX;
If IY < 0 Then IY : = IY + 2147483647 + 1;
IX: =IY;
RANDU : = IY / 2147483647;
End;
Obs. Como o programa fora overow, a condio overflow checking deve estar
desligada quando da compilao/execuo.
Aseguir umprograma pascal que utiliza o gerador acima. Oprograma inicialmente
inicializa o gerador e ento gera e imprime os 5 primeiros nmeros aleatrios.
{USO DA RANDU}
{$N+}
{ $E+}
Var
SEMENTE, I : Integer ;
ALEAT: Real ;
{ $I RANDU. PAS}
Begin
Writeln( Qual a semente (1 - 32767) ? ) ;
Readln(SEMENTE) ;
ALEAT: = RANDU(SEMENTE) ;
SEMENTE : = 0;
For I : =1 to 5 do
Begin
ALEAT : = RANDU(SEMENTE) ;
Writeln(ALEAT) ;
End;
End.
1
Todos os programas listados a seguir foram desenvolvidos com a finalidade exclusiva de ilustrar
a matria apresentada. No houve qualquer preocupao em otimiz-los ou usar as tcnicas mais
refinadas de programao.
Outro fator a ser considerado que certos comandos usados nos programas podem no funcionar,
dependendo do compilador que estiver sendo usado.
2.5 O gerador RANDU e a formao de trelias 21
Para uma semente igual a 313, os nmeros impressos por este programa so:
0.0573133, 0.2579080, 0.0316280, 0.8685962 e 0.9269251.
Na dcada de 70 diversos trabalhos provaram que a rotina RANDU apresentava
resultados estatisticamente ruins.
Um dos problemas era a formao de trelias (lattice em ingls) quando se traava
grficos com sucessivos nmeros aleatrios gerados pela RANDU.
Vamos imaginar umcubo comlados igual a 1, ou seja variando de 0 a 1. Vamos mar-
car pontos neste cubo com coordenadas (x
1
, x
2
, x
3
),(x
2
, x
3
, x
4
) , (x
3
, x
4
, x
5
), etc...,
onde x
i
um nmero gerado pela RANDU.
Vamos marcar 5.000 pontos. O que deveramos esperar ?
Que o cubo fosse preenchido uniformemente pelos pontos plotados. O que ocorre no
entanto que todos os pontos aparecem em 15 planos formando o que parece ser
uma trelia (da o nome). Nenhum ponto cai entre os planos, como podemos ver no
grfico abaixo:
Este aspecto, identificado claramente na RANDU, fez com que esta rotina fosse
abandonada como geradora de nmeros aleatrios.
A partir da apareceram diversas alternativas sendo que veremos a seguir duas
das mais usadas na atualidade.
A 1
a
est baseada na seguinte relao e atualmente usada pela IBM:
x
i+1
= (16807 x
i
) mod 2147483647
Rotulamos ela como RAND1 mas, exceto a RANDU, nenhum outro gerador tem
nome prprio.
22 A gerao de Nmeros Aleatrios
A rotina a seguir, a sua implementao em Pascal. A funo a ser chamada tem
em KX a semente e no prprio nome da funo (RAND1), o n
o
aleatrio entre [0, 1].
IX : Longint ;
Function RAND1(KX: Integer ) : Real ;
Const
A = 16807;
B15 = 32768;
B16 = 65536;
P = 2147483647;
Var
XHI,XALO, LEFTLO, FHI,K: Longint ;
Begin
If KX <> 0 Then IX : = KX;
XHI : = IX Div B16;
XALO : = ( IX XHI B16) A;
LEFTLO : = XALO Div B16;
FHI : = XHI A + LEFTLO;
K : = FHI Div B15;
IX : = ( ( ( XALOLEFTLOB16)P) +( FHIKB15) B16)+K;
If IX < 0 Then IX : = IX + P;
RAND1 : = IX 4.656612875E10;
End;
Na 1
a
vez em que a funo chamada deve-se passar a semente. A partir da 2
a
chamada, o argumento passado deve ser igual a 0 e a funo retorna um nmero
aleatrio em [0,1].
O programa a seguir imprime os 5 primeiros nmeros aleatrios gerados a partir
de uma semente escolhida.
{USO DA RAND1}
{$N+}
{ $E+}
Var
SEMENTE, I : Integer ;
ALEAT: Real ;
{ $I RAND1. PAS}
Begin
Writeln( Qual a semente ? (1 - 32767) ) ;
Readln(SEMENTE) ;
ALEAT: = RAND1(SEMENTE) ;
SEMENTE : = 0;
For I : =1 to 5 do
Begin
ALEAT : = RAND1(SEMENTE) ;
Writeln(ALEAT) ;
End;
End.
Para uma semente igual a 313 os 5 primeiros nmeros gerados so: 0.1713277,
0.5044658, 0.5574913, 0.7561453 e 0.5342253.
2.5 O gerador RANDU e a formao de trelias 23
A 2
a
opo, atualmente muito usada, est baseada no trabalho de Marse e Robert
[Marse, K., and S. D. Roberts: Implementing a Portable Fortran Uniform (0,1) Ge-
nerator, Simulation, 41: 135-139 (1983)] e tem sua base na relao:
x
i+1
= (630360016 x
i
) mod 2147483647
Para facilitar o acesso aos nmeros gerados, a implementao que veremos a seguir
permite a gerao de 21.474 sries diferentes de nmeros aleatrios.
Na 1
a
vez que a rotina chamada deve-se usar U = RAND2(n, 0) onde n um
nmero que indica qual das 21.474 sries se deseja usar. Nesta 1
a
chamada ser
gerada a semente para a srie n(0 n 21.473). A semente na verdade a srie
que se deseja usar.
A partir da 2
a
chamada deve-se usar U = RAND2(n, 1).
Uma regra importante, que em cada srie s devem ser considerados os 100.000
primeiros nmeros aleatrios gerados. Assim se for preciso gerar mais de 100.000
nmeros aleatrios, deve-se mudar de srie.
A seguir apresentamos a sua implementao em Pascal:
ZRNG: Longint ;
Function RAND2(ISTRM, ISEED: Integer ) : Double;
Const
MULT1 = 24112;
MULT2 = 26143;
B2E15 = 32768;
B2E16 = 65536;
MODLUS = 2147483647;
Var
HI15 , HI31 , LOW15,LOWPRD: Longint ;
OVFLOW, ZI : Longint ;
Z, Z1 : Double;
I : Integer ;
Begin
If ISEED = 0 Then
Begin
Z : = 1973272912;
For I : =1 to ISTRM do
Begin
Z1 : = ( 715. 0Z) / 2147483647. 0;
Z : = ( 715. 0Z) Int ( Z1)2147483647. 0;
Z1 : = ( 1058. 0Z) / 2147483647. 0;
Z : = ( 1058. 0Z) Int ( Z1)2147483647. 0;
Z1 : = ( 1385. 0Z) / 2147483647. 0;
Z : = ( 1385. 0Z) Int ( Z1)2147483647. 0;
End;
ZRNG : = Trunc ( Z ) ;
End;
ZI : = ZRNG;
HI15 : = ZI Div B2E16;
LOWPRD : = ( ZIHI15B2E16) MULT1;
LOW15 : = LOWPRD Div B2E16;
HI31 : = HI15MULT1+LOW15;
OVFLOW : = HI31 Div B2E15;
ZI : = ( ( (LOWPRDLOW15B2E16)MODLUS) +( HI31OVFLOWB2E15) B2E16)+OVFLOW;
If ZI < 0 Then ZI : = ZI + MODLUS;
24 A gerao de Nmeros Aleatrios
HI15 : = ZI DIV B2E16;
LOWPRD : = ( ZIHI15B2E16) MULT2;
LOW15 : = LOWPRD Div B2E16;
HI31 : = HI15MULT2+LOW15;
OVFLOW : = HI31 Div B2E15;
ZI : = ( ( (LOWPRDLOW15B2E16)MODLUS) +( HI31OVFLOWB2E15) B2E16)+OVFLOW;
If ZI < 0 Then ZI : = ZI + MODLUS;
ZRNG : = ZI ;
RAND2 : = ( 2( ZI / 256) +1) / 16777216. 0;
End;
Apresentamos a seguir um programa que obtm e imprime os 5 primeiros nmeros
gerados pela RAND2. Deve-se observar que, no programa, a varivel ALEAT, que
recebe o n
o
aleatrio deve ser definida como Double Precison.
{USO DA RAND2}
{$N+}
{ $E+}
Var
SERIE, I ,PARM1: Integer ;
ALEAT: Double;
{ $I RAND2. PAS}
Begin
PARM1 : = 0;
Writeln( Qual a serie ? (0 - 21473) ) ;
Readln(SERIE) ;
ALEAT: = RAND2( SERIE,PARM1) ;
PARM1 : = 1;
For I : =1 to 5 do
Begin
ALEAT : = RAND2( SERIE,PARM1) ;
Writeln(ALEAT) ;
End;
End.
Para n = 2, os 5 primeiros nmeros gerados so 0.436457, 0.556578, 0.617909,
0.768997 e 0.595177.
2.6 Mtodos com perodos maiores
Os mtodos vistos anteriormente ainda so muito usados, inclusive a RANDU!. No
entanto, para simulaes mais complexas, seus perodos so relativamente curtos
(10
9
) o que temlevado ao desenvolvimento de novos mtodos de gerao de nmeros
aleatrios, todos com a caracterstica comum de ter grandes perodos (> 10
30
).
Para exemplificar o que dissemos acima, vamos apresentar a seguir um gerador
que rotulamos de RAND3.
2.6 Mtodos com perodos maiores 25
Ele est baseado no trabalho Toward a Universal Random Number Generator
George Marsaglia, Florida State University Report: FSU-SCRI-87-50 (1987).
Ele se enquadra emuma classe de geradores chamados de Geradores de Fibonacci
e esto baseados na seguinte recorrencia:
x
i
= (x
ip
+x
ik
) mod m onde p > k > 0
Obviamente que o mtodo precisa de p sementes para se obter o primeiro nmero
gerado pela frmula. Tambm como o perodo muito grande, necessrio se ter
tcnicas para se pegar pedaos do gerador para quando se precisar de mais uma
gerao em uma simulao. A RAND3, apresentada a seguir, j tem todos estes
clculos embutidos e a partir de somente 2 sementes, fornecidas inicialmente, ele
cria seqencias de nmeros aleatrios diferentes.
Como dissemos, o mtodo pede 2 sementes. A 1
a
no intervalo [1, 31328] e a 2
a
no
intervalo [1,30081].
Para cada par de sementes gerada uma srie de nmeros aleatrios com perodo
de 10
30
.
Assim, variando-se as sementes temos 900.000.000 de sries, cada uma com 10
30
nmeros aleatrios.
A rotina em Pascal (RAND3) a seguinte:
Type
VETOR = Array[ 1. . 98] of Double;
Var
I97 , J97 : Longint ;
C, CD,CM : Double;
U: VETOR;
Function RAND3( Var IJ , KL,PARAM: Longint ) : Double;
VAR
S, T, UNI: Double;
J , K, L, II , JJ ,M: Longint ;
Begin
If PARAM = 0 Then
Begin
I97 : = 97;
J97 : = 33;
UNI : = 0;
IJ : = IJ Mod 31329;
KL : = KL Mod 30082;
PARAM : = ( ( IJ Div 177) Mod 177) + 2;
J : = ( IJ Mod 177) + 2;
K : = ( (KL Div 169) Mod 178) + 1;
L : = KL Mod 169;
For I I : = 1 to 97 do
Begin
S : = 0. 0;
T : = 0. 5;
For JJ : = 1 to 24 do
Begin
M : = ( (PARAMJ) Mod 179)K;
M : = M Mod 179;
PARAM : = J ;
26 A gerao de Nmeros Aleatrios
J : = K;
K : = M;
L : = (53L+1) Mod 169;
If ( ( LM) Mod 64) >= 32 Then S : = S + T;
T : = T 0. 5;
End;
U[ I I ] : = S;
End;
C : = 362436.0 / 16777216. 0;
CD : = 7654321.0 / 16777216. 0;
CM : = 16777213.0 / 16777216. 0;
I97 : = 97;
J97 : = 33;
RAND3 : = UNI;
Exit ;
End;
UNI : = U[ I97 ] U[ J97 ] ;
If UNI < 0. 0 Then UNI : = UNI + 1. 0;
U[ I97 ] : = UNI;
I97 : = I97 1;
If I97 = 0 Then I97 : = 97;
J97 : = J97 1;
If J97 = 0 Then J97 : = 97;
C : = C CD;
If C < 0. 0 Then C : = C + CM;
UNI : = UNI C;
If UNI < 0 Then UNI : = UNI + 1. 0;
RAND3 : = UNI;
End;
A seguir temos um programa que usa a RAND3 e imprime os 5 primeiros nmeros
gerados a partir de um par de sementes.
A chamada que inicializa a rotina, onde I e J so as sementes escolhidas, deve
ser do tipo ALEAT = RAND3(I,J,0). A varivel que recebe o nmero aleatrio
deve ser de preciso dupla. As chamadas subsequentes so feitas com ALEAT =
RAND3(0,0,1).
{USO DA RAND3}
{$N+}
{ $E+}
Var
SEMENTE1,SEMENTE2, PARAM : Longint ;
I : Integer ;
ALEAT : Double;
{ $I RAND3. PAS}
Begin
PARAM : = 0;
Writeln( Qual a 1a. SEMENTE ? (1 - 31328) ) ;
Readln(SEMENTE1) ;
Writeln( Qual a 2a. SEMENTE ? (1 - 30081) ) ;
Readln(SEMENTE2) ;
2.6 Mtodos com perodos maiores 27
ALEAT: = RAND3(SEMENTE1,SEMENTE2,PARAM) ;
PARAM : = 1;
For I : =1 to 5 do
Begin
ALEAT : = RAND3(SEMENTE1,SEMENTE2,PARAM) ;
Writeln(ALEAT) ;
End;
End.
Com a 1
a
semente igual a 1802 e a 2
a
igual a 9373 os 5 primeiros nmeros gerados
so: 0.116391, 0.964849, 0.88297, 0.420487 e 0.495856.
Um outro gerador tem um perodo ainda maior que a RAND3. A sua descrio
pode ser vista no paper An object-oriented random-number package with many
long streams and substreams Pierre LEcuyer, Richard Simard, E.Jack Chen and
W. David Kelton - 2000. Vamos, para efeito de referncia futura, cham-lo de
RAND4.
Este gerador pertence a uma classe de geradores que nada mais so do que a combi-
nao de 2 ou mais geradores congruentes, baseados na condio de que o perodo
de 2 geradores embaralhados maior do que de um gerador s. No caso deste
gerador, seu perodo de 3.1 10
57
. As frmulas de gerao so:
A
i
= (1403580 A
i2
810728 A
i3
)mod(2
32
209)
B
i
= (527612 B
i1
1370589 B
i3
)mod(2
32
22853)
Y
i
= (A
i
B
i
)mod(2
32
209)
U
i
=
Y
i
2
32
208
O mtodo permite que sejam geradas 10
19
sries diferentes, cada uma delas com
10
38
nmeros aleatrios !!
Por ser muito grande, no listamos aqui o programa fonte (RAND4).
Esta verso do programa s permite que se use 50 sries, mas devemos ressaltar
que isto equivale a se ter 50 geradores diferentes, cada um com 10
38
nmeros ale-
atrios !
O programa tambm tem sub-rotinas que permitem que se pule dentro de uma
srie, ou seja, posso escolher sub-sries dentro de cada uma das 50 sries dispon-
veis.
So necessrias 6 sementes iniciais, no intervalo [1; 4294967087].
O programa a seguir, utiliza a RAND4 para gerar nmeros aleatrios. Ele imprime
os 3 primeiros nmeros gerados das sries 1, 2, 3 e 4. Em seguida faz com que a
srie 1 pule 2
25
+ 50000 = 33.604.432 nmeros aleatrios e, a partir deste ponto,
mais 3 nmeros da srie 1 so impressos. Finalmente o programa imprime a soma
dos 100 primeiros nmeros gerados para as 50 sries distintas, aps voltar ao incio
das 4 sries usadas.
Obs. A varivel SERIE j est definida e pode ser usada.
28 A gerao de Nmeros Aleatrios
{USORAND4}
{N+}
{E+}
var
K, I : Longint ;
SOMA, NUMALEAT: Double;
SEMENTE: Array[ 0 . . 5 ] of Double;
{ $I Rand4. pas }
Begin
For I : = 1 to 6 do
Begin
Writeln( Semente , I , ? ) ;
Readln(SEMENTE[ I 1] ) ;
If (SEMENTE[ I 1] < 1. 0 ) or (SEMENTE[ I 1] > 4294967087.0) then
Begin
writeln( Semente fora da faixa permitida ! ) ;
Exit ;
End;
End;
{ ========================================================}
{ Passagem das sementes para a RAND4}
SETASEMENTE(SEMENTE) ;
{ ========================================================}
{ Rotina da RAND4 que tem que ser obri gatori amente chamada no i nci o }
I ni c i o ;
{ ========================================================}
SOMA : = 0. 0;
For I : = 1 to 4 do
Begin
SERIE : = I ;
For K : = 1 to 3 do
Begin
NUMALEAT : = RAND4;
Writeln( Serie ,SERIE, No. Aleatorio = ,NUMALEAT) ;
End;
End;
SERIE : = 1;
AVANCAESTADO(25 , 50000 ,SERIE) ;
For K: = 1 to 3 do
Begin
NUMALEAT : = RAND4;
Writeln( Serie ,SERIE, No. Aleatorio = ,NUMALEAT) ;
End;
For I : = 1 to 4 do
Begin
SERIE : = I ;
VOLTAINICIOSERIE(SERIE) ;
End;
For I : = 1 to 50 do
Begin
SERIE : = I ;
For K : = 1 to 100 do
Begin
2.7 Geradores de nmeros aleatrios embutidos 29
NUMALEAT : = RAND4;
SOMA : = SOMA + NUMALEAT;
End;
End;
Writeln( SOMA = ,SOMA) ;
End.
Para as sementes 78975, 2731847, 1300, 15873476, 7590 e 6150 os nmeros alea-
trios encontrados foram:
Srie 1 : 0.58804, 0.06393 e 0.28012
Srie 2: 0.82639, 0.35619 e 0.55459
Srie 3: 0.13759, 0,07373 e 0.24462
Srie 4: 0.57235; 0.50824 e 0.89428.
Aseguir, atravs do comando AVANCAESTADO(25,50000,SERIE), a srie 1 avan-
ada. Este comando faz com que, na srie 1, sejam pulados 2
25
+ 50000 =
33.604.432 nmeros, ou seja como se a gerao tivesse saltado aquela quanti-
dade de nmeros aleatrios. Em seguida se imprime 3 nmeros da srie 1 que so
0.38099, 0.14266 e 0.50491.
A seguir, atravs do comando VOLTAINICIOSERIE(SERIE), volta-se as 4 primei-
ras sries ao seu ponto inicial. Finalmente o programa imprime a soma dos 100
primeiros nmeros gerados nas 50 sries, ou seja 2496,121.
2.7 Geradores de nmeros aleatrios embutidos
Em algumas linguagens tais como C, BASIC, PASCAL, etc..., existe um gerador de
nmeros aleatrios embutido na prpria linguagem. Tambm existem geradores
em programas aplicativos tais como Excel, Lotus 123, etc...
Exemplificando, temos a seguir um programa em BASIC para gerar nmeros ale-
atrios uniformemente distribudos no intervalo [0, 1].
INPUT Qual a Semente ?; semente
RANDOMIZE( semente )
FOR i = 1 to 5
X = RND
PRINT X
NEXT i
END
O comando RANDOMIZE inicializa, com a semente, o gerador de nmeros aleat-
rios que um comando da prpria linguagem.
Executando-se este programa no QuickBasic com a semente 1813, obtemos os n-
meros:
0.9601251, 0.4571911, 0.7457173, 0.9784663 e 0.6727366.
Obviamente, usando-se outro compilador BASIC, obteremos nmeros diferentes.
Os geradores embutidos, normalmente, no so muito confiveis e devem ser
usados com reservas. Uma das rotinas embutidas mais usadas a RANDU !
30 A gerao de Nmeros Aleatrios
2.8 Nmeros aleatrios com outras distribuies uniformes
Uma vez que temos uma rotina para gerar nmeros uniformemente distribudos
no intervalo [0, 1], fcil ger-los com outras distribuies uniformes.
2.8.1 Variveis aleatrias contnuas
Suponha que X uma varivel aleatria contnua, uniformemente distribuda den-
tro do intervalo (a, b), onde a < b. Faamos U representar uma varivel aleatria
uniformemente distribuda no intervalo [0, 1]. Aplicando proporcionalidade sim-
ples temos:
_
X a
b a
_
=
_
U 0
1 0
_
ou
X = a + (b a) U
Assim muito simples gerar X de um dado U, conhecendo-se a e b.
Exemplo: Fazer um comando Pascal para gerar variveis aleatrias contnuas uni-
formemente distribudas no intervalo [1, 4].
X := 1. + 3. * RAND(0);
Obs. (RAND pode ser a RAND1, RAND2, etc...)
2.8.2 Variveis aleatrias discretas
Agora suponha que a e b sejam quantidades inteiras, a < b, e X uma vari-
vel aleatria discreta (s valores inteiros) uniformemente distribuda no intervalo
[a, b]. Assim X s pode tomar valores iguais a a, a + 1, a + 2, ..., b 1, b.
Se U contnua e uniformemente distribuda no intervalo [0, 1], ento:
X = a + INT[(b a + 1) U]
onde INT a funo inteiro, ou seja a que elimina as decimais.
Observe que como 0 U < 1, a quantidade INT{(ba+1)U} toma os valores
inteiros 0, 1, 2, .., (b a). Logo X s pode tomar valores a, a + 1, a + 2, ..., b.
Vejamos um exemplo: Seja a = 2 e b = 7.
Assim X ser igual a:
X = 2 + INT[(7 2 + 1) U]
X = 2 + INT[6 U)]
X = 2+ um valor de 0 a 5, inteiro.
Logo X pode ser 2, 3, 4, 5, 6 ou 7.
2.9 Testes estatsticos para a uniformidade 31
Exemplo: Fazer uma rotina Pascal que simule se jogar, simultaneamente, 2 dados.
Var
X, X1, X2: Integer ;
. . . . . . . . . . . . . . . . .
X1 : = 1 + TRUNC( 6. 0 RAND( 0 ) ) ;
X2 : = 1 + TRUNC( 6. 0 RAND( 0 ) ) ;
X : = X1 + X2;
. . . . . . . . . . . . . . . . .
Obs. Em Pascal o comando para pegar s a parte inteira de um nmero TRUNC.
2.9 Testes estatsticos para a uniformidade
Existem numerosos testes estatsticos para garantir que os nmeros pseudos-alea-
trios esto sendo gerados aleatoriamente. Veremos alguns deles sem nos aprofun-
darmos na teoria estatstica.
Um teste bsico que sempre deve ser realizado para validar um gerador de nme-
ros aleatrios o teste de uniformidade. Veremos 2 dos mais usados: o teste de
Kolmogorov-Smirnov e o teste do Qui-Quadrado (
2
).
Ambos os testes medem o grau de aderncia entre a distribuio de uma amostra
de nmeros aleatrios gerados e a distribuio uniforme terica. Ambos os tes-
tes esto baseados na hiptese nula de que nenhuma diferena significante existe
entre a amostra e a distribuio terica.
2.9.1 O teste do
2
(qui-quadrado)
Chamando O
i
de frequncia observada e E
i
de frequncia esperada na categoria i,
o
2
pode ser calculado da seguinte forma:
2
calc
=
(O
1
E
1
)
2
E
1
+
(O
2
E
2
)
2
E
2
+. . . +
(O
k
E
k
)
2
E
k
Este teste feito com um determinado nvel de significncia, , normalmente 5%.
O teste diz que se o
2
calc
for menor que o
2
tabelado
aceitamos a hiptese nula (H
0
),
ou seja de que a sequncia de nmeros aleatrios gerados uniformemente distri-
buda em [0, 1].
Vejamos um exemplo: sejam os nmeros aleatrios a seguir:
0.34 0.90 0.25 0.89 0.87 0.44 0.12 0.21 0.46 0.67
0.83 0.76 0.79 0.64 0.70 0.81 0.94 0.74 0.22 0.74
0.96 0.99 0.77 0.67 0.56 0.41 0.52 0.73 0.99 0.02
0.47 0.30 0.17 0.82 0.56 0.05 0.45 0.31 0.78 0.05
0.79 0.71 0.23 0.19 0.82 0.93 0.65 0.37 0.39 0.42
0.99 0.17 0.99 0.46 0.05 0.66 0.10 0.42 0.18 0.49
0.37 0.51 0.54 0.01 0.81 0.28 0.69 0.34 0.75 0.49
0.72 0.43 0.56 0.97 0.30 0.94 0.96 0.58 0.73 0.05
0.06 0.39 0.84 0.24 0.40 0.64 0.40 0.19 0.79 0.62
0.18 0.26 0.97 0.88 0.64 0.47 0.60 0.11 0.29 0.78
32 A gerao de Nmeros Aleatrios
Dividindo em 10 intervalos [0;0.1), [0.1;0.2),...,[0.9;1] e contando a quantidade de
nmeros gerados em cada intervalo (O
i
), podemos efetuar os clculos para se testar
com o
2
.
Intervalo O
i
E
i
O
i
E
i
(O
i
E
i
)
2
(O
i
E
i
)
2
/E
i
0.0 0.1 8 10 -2 4 0.4
0.1 0.2 8 10 -2 4 0.4
0.2 0.3 10 10 0 0 0.0
0.3 0.4 9 10 -1 1 0.1
0.4 0.5 12 10 2 4 0.4
0.5 0.6 8 10 -2 4 0.4
0.6 0.7 10 10 0 0 0.0
0.7 0.8 14 10 4 16 1.6
0.8 0.9 10 10 0 0 0.0
0.9 1.0 11 10 1 1 0.1
100 100
= 3.4
2
calc
= 3.4
O valor do
2
tab
encontrado em tabelas onde 2 parmetros so necessrios: o n-
mero de graus de liberdade (nu) e o nvel de significncia ().
O nmero de graus de liberdade igual ao nmero de intervalos 1. O nvel de
significncia ser 5% ou 0.05.
Logo com = 10 1 = 9 e = 0.05 encontramos:
2
tab
= 16.9 (tabela pgina 125)
No nosso exemplo como 3.4 < 16.9, ns aceitamos a hiptese de que os nmeros
foram gerados uniformemente distribudos em [0, 1].
Para melhorar a preciso do teste do
2
devemos agrupar, na superior, as catego-
rias em que a freqencia esperada (E
i
) 5.
O programa abaixo usa a RAND2 para gerar 5.000 nmeros aleatrios e a seguir
calcula o
2
calc
.
{TESTE do QUIQUADRADO}
{$N+}
{ $E+}
Type
VETOR1 = Array[ 1. . 10] of Integer ;
VETOR = Array[ 1. . 5000] of Double;
Var
I , J , PARAM, N, ISER: Integer ;
U: Double;
QUIC: Real ;
A: Vetor ;
INTERV: Vetor1 ;
{ $I RAND2. PAS}
Begin
PARAM : = 0;
Writeln( Qual a Serie (0 a 21473) ? ) ;
Readln( ISER) ;
Writeln( Quantos Numeros (MAX = 5.000) ? ) ;
Readln(N) ;
2.9 Testes estatsticos para a uniformidade 33
U : = RAND2( ISER,PARAM) ;
PARAM : = 1;
{AMOSTRA DE N NUMEROS ALEATORIOS }
For I : =1 to N do
Begin
U : = RAND2( ISER,PARAM) ;
A[ I ] : = U;
End;
{SOMA OS NUMEROS NO SEU INTERVALO}
For I : =1 to N do
Begin
A[ I ] : = A[ I ] 10;
J : = TRUNC(A[ I ] ) ;
INTERV[ J+1] : = INTERV[ J+1] + 1;
End;
QUIC : = 0. 0;
U : = N / 10. 0;
{CALCULA E IMPRIME O QUIQUADRADO}
For I : = 1 to 10 do
Begin
QUIC : = QUIC + SQR(INTERV[ I ] U) / U;
End;
Writeln( QUI-QUADRADO Calculado = ,QUIC) ;
End.
Para a srie 1813 o valor encontrado de 4.744. Como este valor menor que 16.9,
aceitamos a hiptese de que a RAND2 gera nmeros aleatrios uniformemente
distribudos.
2.9.2 O teste de Kolmogorov-Smirnov
Este teste compara a funo de distribuio acumulada contnua, F(x), da distri-
buio uniforme com a funo de distribuio acumulada emprica, S
N
(x), de uma
amostra de N observaes. No caso da distribuio uniforme em [0, 1], temos por
definio,
F(x) = P(X x) = x, 0 x 1
Se a amostra de nmeros aleatrios U
1
, U
2
, ..., U
N
, ento a funo de distribuio
acumulada contnua emprica , S
N
(x), definida por
S
N
(x) =
nmeros de U
1
, U
2
, . . . , U
N
que so x
N
Quando N se torna grande, S
N
(x) deveria se tornar uma boa aproximao para
F(x) garantindo que a hiptese nula verdadeira.
O teste de Kolmogorov-Smirnov est baseado no maior desvio absoluto entre F(x)
e S
N
(x) no intervalo da varivel aleatria., ou seja ele est baseado na estatstica
D = max | S
N
(x) F(x) |
34 A gerao de Nmeros Aleatrios
A distribuio de D conhecida e est tabelada como uma funo de N.
Para testar contra uma funo de distribuio acumulada contnua uniforme, os
procedimentos so:
1. Ordene os dados (nmeros aleatrios) do menor para o maior:
U
(1)
U
(2)
, . . . , U
(N)
2. Atribua, para cada nmero, U
i
, ordenado, um valor seqencial (i). O valor de
S
i
igual a i/N.
3. Calcule, para cada valor de i, a diferena, em valor absoluto, entre S
x
, ou seja
i/n e F
x
, ou seja o prprio U
i
4. Faa D ser igual a maior diferena encontrada.
5. Determine o valor crtico, D
n + 0.12 +
0.11
n
_
D C
O valor de C
0.05
1.358. No nosso caso temos ento:
_
5 + 0.12 +
0.11
5
_
0.26 = 0.625
Logo como 0.625 menor que 1.358, aceitamos H
0
.
O programa Pascal a seguir, calcula o valor de D para uma amostra de 5.000 n-
meros aleatrios gerados usando-se a RAND2 vista anteriormente:
2.9 Testes estatsticos para a uniformidade 35
{TESTE DE KOLMOGOROVSMIRNOV}
Type
Vetor = Array[ 1. . 5000] of Double;
Var
ISER, I ,PARAM: Integer ;
D,U: Double;
N, DIFE, DIFD: Real ;
A : Vetor ;
{ $I RAND2. PAS}
{ }
Procedure CLASSIFICA(LEFT, RIGHT: Integer ; Var A: Vetor ) ;
Var
II , L1, R1, I , J : Integer ;
K, TR: Double;
Begin
K : = (A[LEFT] + A[RIGHT] ) / 2 . ;
I : = LEFT;
J : = RIGHT;
Repeat
While A[ I ] < K do
INC( I , 1 ) ;
While K < A[ J] do
DEC( J , 1 ) ;
If I <= J then
Begin
TR : = A[ I ] ;
A[ I ] : = A[ J ] ;
A[ J] : = TR;
INC( I , 1 ) ;
DEC( J , 1 ) ;
End;
Until I > J ;
If LEFT <J then
CLASSIFICA(LEFT, J , A) ;
If I < RIGHT then
CLASSIFICA( I , RIGHT, A) ;
End;
{ }
Begin
PARAM : = 0;
N : = 5000;
Writeln( Qual a Serie (0 a 21473) ? ) ;
Readln( ISER) ;
U : = RAND2( ISER,PARAM) ;
PARAM : = 1;
For I : =1 to Trunc (N) do
Begin
U : = RAND2( ISER,PARAM) ;
A[ I ] : = U;
End;
CLASSIFICA( 1 , Trunc (N) , A) ;
D : = 9999.0;
For I : = 1 to Trunc (N) do
36 A gerao de Nmeros Aleatrios
Begin
DIFD : = ( I / N) A[ I ] ;
If DIFD < 0 then DIFD : = 9999;
DIFE : = A[ I ] ( ( I 1) / N) ;
If DIFE < 0 then DIFE : = 9999;
If DIFE > D then D : = DIFE;
If DIFD > D then D : = DIFD;
End;
Writeln( D = ,D) ;
End.
A execuo deste programa, com a srie 1400, vai imprimir o valor de 0,0105386
para D.
Temos ento:
_
5000 + 0.12 +
0.11
5000
_
0.01053864 = 0.746
Como 0.746 menor que 1.358, aceitamos que a RAND2 gera uma sequncia de
nmeros aleatrios uniformemente distribudos em [0, 1].
Convm neste ponto esclarecer a diferena entre uniformidade e aleatoriedade ou
independncia. Assim a seqncia 0.01, 0.10, 0.15, 0.20, 0.25, etc..., uniforme
mas no aleatria. Uniformidade necessria mas no suficiente.
2.10 Testes de Aleatoriedade (Independncia)
2.10.1 O teste do Intervalo (Gap test)
O teste do intervalo usado para testar a ordem de uma seqncia de dgitos alea-
trios. Neste teste ns contamos o nmero de dgitos entre a i esima e a i esima+1
ocorrncia de um dgito particular d. Se n outros dgitos esto presentes temos en-
to um intervalo (gap) de comprimento n. Todos os intervalos so determinados
para cada d, onde d pode ser um dos 10 valores possveis (0,1,...,9). Tabulamos
ento o total do nmero de ocorrncias de cada comprimento de intervalo.
O nmero esperado de intervalos de comprimento n dado por :
E
n
= (0.9)
n
(0.1)N, onde N nmero total de intervalos.
Podemos ento usar o teste do
2
para verificar a aleatoriedade.
No caso de nmeros gerados por um gerador bsico, ou seja uniforme em [0, 1], te-
mos que relacionar intervalos com os dgitos de 0 a 9.
Assim sendo, se o nmero estiver no intervalo [0, 0.1), consideramos como sendo o
nmero 0. Se estiver no intervalo [0.1, 0.2), consideramos como sendo igual a 1 e
assim por diante.
2.10 Testes de Aleatoriedade (Independncia) 37
Exemplo: Sejam os 48 nmeros aleatrios a seguir:
0.956 0.283 0.365 0.056 0.604 0.013
0.447 0.934 0.788 0.766 0.132 0.039
0.832 0.097 0.719 0.471 0.074 0.652
0.894 0.532 0.256 0.684 0.313 0.248
0.917 0.546 0.357 0.936 0.045 0.369
0,576 0.632 0.248 0.561 0.245 0.611
0.377 0.501 0.872 0.727 0.506 0.622
0.175 0.973 0.540 0.492 0.717 0.809
Associando os nmeros gerados em cada faixa aos dgitos correspondentes, encon-
tramos a seguinte seqencia:
923 060 497 710 807 406 852 632 953 903 562 526 358 756 195 478.
Usando o nmero 0 como exemplo, vamos encontrar os intervalos (gaps):
O 1
o
intervalo tem comprimento 1 pois, na seqencia, temos o 1
o
zero, logo depois o
nmero 6 e, a seguir, outro 0. O prximo 0 aparece depois dos nmeros 47171, ou
seja temos um intervalo de comprimento igual a 5. A seguir aparecem os nmeros
7 e 4 e outro 0. Temos ento um intervalo de comprimento 2. Finalmente o ltimo
0 vai aparecer depois dos nmeros 68526329539. Temos um intervalo de compri-
mento igual a 11.
Procedendo de forma idntica para os outros dgitos (1 a 9), podemos construir a
tabela a seguir:
d Comprimento Intervalo (n)
0 1, 5, 1, 2, 11
1 31
2 18, 2, 8, 1
3 19, 3, 2, 6
4 8, 29
5 5, 4, 2, 3, 2, 3
6 12, 3, 9, 3, 5
7 0, 4, 24, 6
8 5, 19, 8
9 6, 16, 2, 15
Um total de 38 intervalos foram encontrados, variando de 0 a 31 (o maior intervalo
possvel 46).
O nmero esperado e observado de intervalos de cada comprimento esto tabulados
a seguir:
38 A gerao de Nmeros Aleatrios
n O
n
E
n
n O
n
E
n
n O
n
E
n
0 1 3.80 17 0 0.63 34 0 0.11
1 3 3.42 18 1 0.57 35 0 0.10
2 6 3.08 19 2 0.51 36 0 0.09
3 5 2.77 20 0 0.46 37 0 0.08
4 2 2.49 21 0 0.42 38 0 0.07
5 4 2.24 22 0 0.37 39 0 0.06
6 3 2.02 23 0 0.34 40 0 0.06
7 0 1.82 24 1 0.30 41 0 0.05
8 3 1.64 25 0 0.27 42 0 0.05
9 1 1.47 26 0 0.25 43 0 0.04
10 0 1.32 27 0 0.22 44 0 0.04
11 1 1.19 28 0 0.20 45 0 0.03
12 1 1.07 29 1 0.18 46 0 0.03
13 0 0.97 30 0 0.16
14 0 0.87 31 1 0.14
15 1 0.78 32 0 0.13
16 1 0.70 33 0 0.12
E
n
foi calculado pela frmula E
n
= (0.9)
n
(0.1)N, com N = 38.
De maneira a aplicar o teste do devemos combinar as categorias de modo que E
i
>
5, para cada nova categoria. Assim obtemos:
i n O
i
E
i
1 0 1 4 7.22
2 2 3 11 5.85
3 4 6 9 6.75
4 7 10 4 6.25
5 11 16 4 5.58
6 17 46 6 6.08
Podemos calcular o
2
.
2
calc
=
(4 7.22)
2
7.22
+
(11 5.85)
2
5.85
+. . . +
(6 6.08)
2
6.08
= 7.98
Para achar o
2
tab
temos = 6 1 = 5 e = 0.05.
Da tabela tiramos
2
tab
= 11.07.
Como
2
calc
menor que o
2
tab
aceitamos a hiptese que a seqncia foi aleatoria-
mente gerada.
2.10 Testes de Aleatoriedade (Independncia) 39
2.10.2 O teste da corrida (Run test)
Uma corrida uma sucesso de eventos similares, precedido e seguido por eventos
diferentes. No nosso caso uma corrida ser uma sucesso de nmeros aleatrios
crescentes ou decrescentes.
O procedimento consiste em contar o nmero total de corridas crescentes e decres-
centes de tamanho n, onde n = 1, 2, 3, ...
O nmero observado de corridas pode ento ser comparado com o nmero espe-
rado de corridas. O valor esperado de corridas de tamanho n, se temos N nmeros
aleatrios, pode ser calculado de:
E
n
=
_
_
2[(n
2
+ 3n + 1)N (n
3
+ 3n
2
n 4)]
(n + 3)!
para n = 1, 2, 3, ..., N 2
2
N!
para n = N 1
A aleatoriedade pode ser determinada pelo teste do
2
.
Exemplo: Vamos aplicar o teste da corrida crescente e decrescente para os 50 nme-
ros aleatrios apresentados a seguir, considerando que os nmeros foram gerados
da esquerda para a direita, por linha:
0.923 0.060 0.497 0.710 0.807
+ + +
0.406 0.852 0.632 0.953 0.903
+ +
0.562 0.526 0.358 0.756 0.195
+
0.478 0.262 0.318 0.720 0.837
+ + + +
0.017 0.513 0.199 0.083 0.335
+ +
0.233 0.035 0.116 0.848 0.432
+ +
0.133 0.451 0.081 0.467 0.249
+ +
0.299 0.575 0.600 0.695 0.380
+ + + +
0.979 0.849 0.999 0.892 0.580
+ +
0.544 0.378 0.872 0.427 0.548
+ +
O 1
o
nmero gerado foi 0,923. O 2
o
foi 0,060, logo houve uma diminuio e colo-
camos o sinal embaixo de 0,060. A seguir foi gerado o nmero 0,497, ou seja
houve uma subida. Colocamos o sinal + embaixo de 0,497. O prximo a ser gerado
foi 0,710. Continuamos subindo e colocamos + embaixo deste ltimo nmero. A
seguir vem 0,807, ou seja subindo ainda e por isso, colocamos + embaixo de 0,807.
40 A gerao de Nmeros Aleatrios
Aparece a seguir o nmero 0,406. Houve uma descida e portanto colocamos em-
baixo de 0,406.
Prosseguimos com este procedimento at o ltimo nmero gerado.
Uma sucesso de sinais +indica uma corrida crescente e uma sucesso de sinais ,
indica uma decrescente.
Como temos 50 nmeros, o tamanho das corridas pode variar de 1 a 49. Os ta-
manhos encontrados (O
n
), assim como os valores esperados (E
n
), calculados das
frmulas acima, esto mostrados na tabela a seguir:
n O
n
E
n
1 23 20.92
2 4 8.93
3 2 2.51
4 3 0.53
5 49 0 0.11
Considerando que N = 50 o clculo de E
2
, por exemplo, :
E
2
=
2[(2
2
+ 3 2 + 1) 50 (2
3
+ 3 2
2
2 4]
(2 + 3)!
= 8.93
Reagrupando os dados de modo que E
i
> 5 para cada categoria, temos:
i n O
i
E
i
1 1 23 20.92
2 2 49 9 12.08
Podemos calcular agora o
2
:
2
calc
=
(23 20.92)
2
20.92
+
(9 12.08)
2
12.08
= 0.99
O
2
tab
para = 1 e = 0.05 igual a 3.841
Como o
2
calc
menor que o
2
tab
, conclumos que os nmeros aleatrios foram ge-
rados aleatoriamente.
2.11 Observaes finais sobre a gerao de nmeros aleatrios 41
2.11 Observaes finais sobre a gerao de nmeros aleat-
rios
Existe uma infinidade de testes estatsticos para testar tanto a aleatoriedade como
a uniformidade. Vimos apenas alguns deles.
O registro importante que se deve fazer que a confiabilidade do gerador de n-
mero aleatrios a condio bsica para se garantir a qualidade estatstica ne-
cessria em um estudo de simulao.
Um gerador, no estatisticamente confivel, pode levar uma simulao a resulta-
dos desastrosos.
Tambm devemos considerar que testes mais rigorosos, quando no se conhece a
qualidade do gerador a ser usado, devem ser feitos.
Um exemplo disto poderia ser a sequncia de nmeros mostrados a seguir:
0.123 0.060 0.497 0.710 0.807
0.406 0.952 0.632 0.953 0.903
0.562 0.526 0.358 0.956 0.195
0.478 0.262 0.318 0.720 0.837
0.917 0.513 0.199 0.083 0.335
0.233 0.035 0.936 0.848 0.432
0.133 0.451 0.081 0.467 0.949
0.299 0.575 0.600 0.695 0.380
0.979 0.912 0.312 0.892 0.580
0.544 0.378 0.872 0.927 0.548
provvel que uma seqencia deste tipo passe em todos os testes que vimos ante-
riormente. No entanto esta seqencia tem um srio desvio: de 7 em 7 nmeros ela
apresenta um nmero maior que 0.900!
42 A gerao de Nmeros Aleatrios
Captulo 3
Alguns modelos elementares de Simulao
A maioria dos problemas estudados atravs de modelos de simulao que acon-
tecem na vida real necessitam do uso de variveis aleatrias no uniformemente
distribudas.
No entanto, como ilustrao, vamos ver 2 exemplos de simulao em que s ne-
cessrio ter um gerador de nmeros aleatrios uniformemente distribudos.
Nos 2 exemplos a seguir a subrotina RAND que aparece nos fluxogramas uma
subrotina genrica podendo ser a RAND1, a RAND2, uma RAND embutida de lin-
guagem, etc...
3.1 Jogo de Dados (Craps Game)
Um jogo popular nos E.Unidos o chamado craps no qual 2 dados so jogados
simultaneamente. Se a soma for 7 ou 11 voc ganha. Se a soma for 2, 3 ou 12 voc
perde. Se der 4, 5, 6, 8, 9 ou 10 voc tem direito a jogar os dados outra vez. Se a
soma for 7 voc perde. Se repetir o que deu na 1
a
jogada voc ganha. Se no, voc
pode jogar os dados outra vez e assim por diante.
Podemos construir um fluxograma mostrando a lgica do jogo:
44 Alguns modelos elementares de Simulao
LER N
SOMA = 0
LAO DE
1 a N
CALL
SUB1
SOMA =
SOMA +
RESULTADO
FIM DO
LAO
IMPRIMIR
SOMA
F I M
INCIO
SUB1
CALL SUB2
X = 7 ou
11?
RESULTADO=1 RETURN
X = 2,3
ou 12?
SIM
NO
RESULTADO=0 RETURN
SIM
NO
K = X
CALL SUB2
X = K ?
NO
RESULTADO=1 RETURN
SIM
X = 7 ? RESULTADO=0 RETURN
SIM
NO
SUB2
X1 = 1 +
INT(6*RAND)
X2 = 1 +
INT(6*RAND)
X1 = X1 +
X2
RETURN
A probabilidade de se ganhar neste jogo de 49,3% obtida da teoria das probabili-
dades.
O programa a seguir a implementao do jogo. Ele permite que a cada execuo
se escolha quantas vezes queremos jogar.
O programa usa a RAND2 como subrotina para gerar nmeros aleatrios.
3.1 Jogo de Dados (Craps Game) 45
{CRAPS GAME}
{$N+}
{ $E+}
Var
ISER, N,PARAM, I ,JOGADA,GUARDA,RESULTADO: Integer ;
U: Double;
SOMA: Real ;
{ $I RAND2. PAS}
{ }
Procedure SUB1 ( Var JOGADA: Integer ) ;
Begin
JOGADA : = TRUNC( ( 1. 0+6. 0RAND2( ISER,PARAM) ) ) +
TRUNC( ( 1. 0+6. 0RAND2( ISER,PARAM) ) ) ;
End;
{ }
PROCEDURE SUB2 ( Var RESULTADO: Integer ) ;
Begin
SUB1(JOGADA) ;
If (JOGADA = 7) or (JOGADA = 11) then
Begin
RESULTADO : = 1;
EXIT;
End;
If (JOGADA = 2) or (JOGADA = 3) or (JOGADA = 12) then
Begin
RESULTADO : = 0;
EXIT;
End;
GUARDA : = JOGADA;
RESULTADO : = 9;
Repeat
SUB1(JOGADA) ;
If JOGADA = 7 then
Begin
RESULTADO : = 0;
EXIT;
End;
If JOGADA = GUARDA then
Begin
RESULTADO : = 1;
EXIT;
End;
Until (RESULTADO = 0) or (RESULTADO = 1) ;
EXIT;
End;
{ }
Begin
PARAM : = 0;
Writeln( Qual a Serie (0 a 21473) ? ) ;
Readln( ISER) ;
U : = RAND2( ISER,PARAM) ;
PARAM : = 1;
Writeln( Quantos Jogos ? ) ;
46 Alguns modelos elementares de Simulao
Readln(N) ;
SOMA : = 0. 0;
For I : = 1 to N do
Begin
SUB2(RESULTADO) ;
SOMA : = SOMA + RESULTADO;
End;
Writeln(SOMA / N) ;
End.
A execuo deste programa 5 vezes, com as sries, escolhidas ao acaso, 1234, 4561,
7893, 8750 e 15700 da RAND2, cada vez com 5.000 jogos, apresentou os seguintes
resultados:
Execuc, o Ganho (%)
1 48,62
2 49,90
3 48,00
4 49,76
5 50,16
Mdia 49,29
3.2 Avaliao de Integrais
Uma aplicao interessante da simulao o clculo de integrais definidas, no
sentido em que um mtodo probabilstico usado para resolver um problema de-
terminstico. Este procedimento chamado de Mtodo de Monte Carlo e no
necessita mais do que um gerador de nmeros aleatrios uniformemente distribu-
dos em [0, 1].
Suponha que se deseja calcular a integral:
I =
_
b
a
f(x)dx
onde f(x) representa uma curva contnua no intervalo a x b. Precisamos
conhecer tambm o valor mximo (F
max
) da funo no intervalo (a, b).
As etapas do mtodo de Monte Carlo so:
1. Gerar um n
o
aleatrio uniformemente distribudo, u
x
, cujo valor est entre a
e b.
2. Calcular f(u
x
).
3. Gerar um 2
o
nmero aleatrio, u
y
, cujo valor est entre 0 e F
max
. Estes 2
nmeros aleatrios (u
x
e u
y
) representam as coordenadas de um ponto no
espao.
4. Comparar u
y
com f(u
x
). Se u
y
no for maior que f(u
x
) ento o ponto (u
x
,
u
y
) cair em cima ou abaixo da curva.
3.2 Avaliao de Integrais 47
5. Repita n vezes as etapas de 1 a 4. Aps isto determine o percentual de pontos
caindo em cima ou abaixo da curva (PERC), ou seja dentro da rea que a
prpria integral.
O valor da integral obtido por:
I = PERC (b a) F
max
O fluxograma a seguir ilustra o procedimento:
INCIO
LER N
K = 0
LAO DE
1 a N
UX=A +
(B-A)*RAND
UY=FMAX *
RAND
UY <=
F(UX) ?
K = K + 1
FIM DO
LAO
SIM
NO
PERC =
K / N
I = PERC *
(B-A)*FMAX
IMPRIMIR I
FIM
Exemplo: Considere a integral abaixo:
_
1
0
_
1 x
2
dx = 0, 785398
1
1 -1 0
F(x)
u
x
u
y
f(u
x
)
A rea da parte do grfico abaixo da curva, no 1
o
quadrante, o valor da integral
procurada.
48 Alguns modelos elementares de Simulao
Neste exemplo a 0 e b 1. O F
max
1.
A rea do retngulo igual a (b a) F
max
, ou seja 1 1 = 1. A integral, ou
seja, a rea abaixo da curva igual a (b a) F
max
% de pontos que caem em
cima ou abaixo da curva.
O programa abaixo implementa o mtodo de Monte Carlo para clculo de integrais
definidas.
{CALCULO DE INTEGRAIS}
{$N+}
{ $E+}
VAR
ISER, N,PARAM, I : Integer ;
U: Double;
X,FMAX, LIMINF, LIMSUP,UX,UY, FUX, IDENTRO, INTEGRAL: Real ;
{ $I RAND2. PAS}
{ }
Function VFUNCAO (X: Real ) : Real ;
Begin
VFUNCAO : = SQRT(1XX) ;
End;
{ }
Begin
PARAM : = 0;
Writeln( Qual a Serie (0 a 21473) ? ) ;
Readln( ISER) ;
U : = RAND2( ISER,PARAM) ;
PARAM : = 1;
Writeln( Quantos Numeros ? ) ;
Readln(N) ;
Writeln( Qual o valor de FMAX ? ) ;
Readln(FMAX) ;
Writeln( Qual o LIMITE INFERIOR ? ) ;
Readln(LIMINF) ;
Writeln( Qual o LIMITE SUPERIOR ? ) ;
Readln(LIMSUP) ;
If (LIMINF >= LIMSUP) Then
Begin
Writeln( ERRO NOS LIMITES ) ;
Exit ;
End;
IDENTRO : = 0;
For I : = 1 to N do
Begin
U : = RAND2( ISER,PARAM) ;
UX : = LIMINF + (U (LIMSUP LIMINF) ) ;
U : = RAND2( ISER,PARAM) ;
UY : = U FMAX;
FUX : = VFUNCAO(UX) ;
If UY <= FUX then IDENTRO : = IDENTRO +1;
End;
INTEGRAL : = (IDENTRO / N) (LIMSUPLIMINF) FMAX;
Writeln( VALOR DA INTEGRAL = ,INTEGRAL) ;
End.
3.2 Avaliao de Integrais 49
O programa utiliza a RAND2 para a gerao dos nmeros aleatrios, enquanto que
na rotina VFUNCAO colocada a funo a ser integrada.
Executando-se este programa, com a srie 1234 da RAND2, e escolhendo-se 10.000
nmeros o valor da integral dado pelo programa como igual a 0.7828.
Como ilustrao do mtodo, a tabela abaixo mostra os primeiros 6 passos do pro-
cesso:
N u
x
f(u
x
) u
y
u
y
f(u
x
) ? k
1 0.7054 0.7086 0.5334 SIM 1
2 0.5795 0.8149 0.2895 SIM 2
3 0.3019 0.9533 0.7747 SIM 3
4 0.0140 0.9999 0.7607 SIM 4
5 0.8144 0.5801 0.7090 NO 4
6 0.0453 0.9989 0.4140 SIM 5
Deve ter ficado claro que o mtodo de Monte Carlo no uma maneira eficiente de
se resolver integrais. Existem, no entanto, um conjunto de integrais extremamente
complexas que podem ser obtidas pelo mtodo.
A integral usada no ltimo exemplo apropriada para se reforar a regra b-
sica do uso da simulao: Problemas que tem soluo analtica nunca devem
ser resolvidos por meio da simulao. Solues analticas daro sempre respos-
tas mais exatas que as respostas fornecidas pela simulao.
Quando, no entanto, no se tem soluo analtica, a simulao pode dar respos-
tas bastante aproximadas.
50 Alguns modelos elementares de Simulao
Captulo 4
Variveis aleatrias no uniformes
Na maioria dos problemas do mundo real, as variveis aleatrias seguem distribui-
es diferentes da uniforme tal como a de Poisson, a Exponencial, a Normal, etc...
Neste captulo veremos como nmeros aleatrios uniformemente distribudos em
[0, 1] podem ser usados para gerar variveis aleatrias, no uniformes, como as
citadas acima.
4.1 O Mtodo da Transformao Inversa
Suponha que ns temos uma funo de densidade probabilstica f(x) e ns deseja-
mos gerar uma varivel aleatria que siga esta funo de densidade probabilstica.
O mtodo da Transformao Inversa oferece uma maneira simples de resolver o
problema.
O mtodo est baseado no fato de que a distribuio acumulada, F(x), tem valor
entre 0 e 1 ou seja, no mesmo intervalo de um n
o
aleatrio, U, gerado por um gera-
dor bsico. Assim sendo, tendo U, consideramos este valor como sendo um valor de
F(x). Para achar o valor de x, basta resolver a equao, ou seja achar a inversa de
F(x).
A figura a seguir mostra, graficamente, o princpio no qual o mtodo est baseado:
F(x)
x
x
0
0
y
0
1
52 Variveis aleatrias no uniformes
Isto , se y = F(x), ento podemos escrever:
x = F
1
(y)
Esta expresso permite determinar um valor particular de x que corresponde a um
dado valor de y. Vamos nos referir a estes valores como x
0
e y
0
. Estes valores esto
ilustrados na figura acima.
Substituindo y pelo nosso nmero uniformemente distribudo em [0, 1], U, temos:
x = F
1
(U)
Exemplo: Aplique o mtodo da transformao inversa para a seguinte funo de
densidade probabilstica:
f(x) =
x
4
em 1 x 3
f(x) = 0 fora do intervalo acima
Use o mtodo para gerar 6 valores sucessivos para X, dados os seguintes valores
aleatrios uniformemente distribudos em [0, 1]: 0.35, 0.97, 0.22, 0.15, 0.60, 0.43.
Inicialmente determinamos a funo cumulativa:
y = F(x) =
_
x
1
_
x
4
_
dx =
_
x
2
8
_
x
1
=
x
2
8
1
8
=
(x
2
1)
8
para 1 x 3.
Resolvendo para x obtemos:
x =
8y + 1
que pode ser escrita como:
x
i
=
8U
i
+ 1
onde U
i
uma varivel aleatria uniformemente distribuda em [0, 1].
Quando U
i
= 0.35 ns podemos obter o valor correspondente para x
i
como:
x
i
=
_
(8) (0.350) + 1 = 1.95
Procedendo de forma idntica, podemos obter os demais valores:
i U
i
x
i
1 0.35 1.95
2 0.97 2.96
3 0.22 1.66
4 0.15 1.48
5 0.60 2.41
6 0.43 2.11
O valor esperado e o desvio padro podem ser calculados de:
E(x) =
_
+
xf(x)dx =
_
3
1
x
x
4
dx =
_
3
1
x
2
4
dx =
_
x
3
12
_
3
1
= 2.167
2
=
_
+
x
2
f(x) E(x)
2
=
_
3
1
x
2
x
4
2.167
2
=
_
x
4
16
_
3
1
2.167
2
= 0.30555
=
0.30555 = 0.552
4.1 O Mtodo da Transformao Inversa 53
Veremos a seguir como aplicar o mtodo da transformao inversa para vrias dis-
tribuies bem conhecidas.
Entretanto bom esclarecer que este mtodo no pode ser aplicado para todas as
distribuies. Existem algumas, como a normal, cuja funo de distribuio proba-
bilstica no pode ser integrada analticamente e, logicamente, no se pode achar
a sua inversa. H casos ainda em que no possvel obter uma equao expl-
cita para x mesmo se tendo uma expresso analtica para a funo cumulativa.
Existem outras tcnicas para estes casos.
4.1.1 Distribuies Empricas
Em muitos problemas reais a probabilidade de que um evento ocorra expressa
em termos de dados empricos agrupados. Vejamos um exemplo.
A seguinte distribuio emprica descreve o valor possvel do custo para um novo
produto a ser desenvolvido em determinada indstria:
Custo de Produc, o Probabilidade
(em $ por unidade) de ocorrncia
60 70 0.20
70 80 0.35
80 90 0.30
90 100 0.15
Gerar 6 valores aleatrios para o custo de produo usando os seguintes nmeros
aleatrios uniformemente distribudos (U): 0.35, 0.97, 0.22, 0.15, 0.60, 0.43.
Chamando de A
j
o limite inferior e B
j
, o limite superior, podemos construir a
tabela da distribuio acumulada (Y
j
):
j A
j
B
j
Y
j
1 $60 $70 0.20
2 70 80 0.55
3 80 90 0.85
4 90 100 1.00
Cada valor de j indica a faixa da distribuio acumulada em que o valor de U se
enquadra. Assim j = 1 compreende os valores de 0 a 0,20. Para j = 2 temos a
faixa de maior que 0,20 a 0,55 e assim por diante.
Para obtermos uma frmula de gerao dos valores da distribuio vejamos o grfico
a seguir, onde queremos obter um valor x, a partir de um determinado valor U. O
valor U se encontra na 2
a
faixa da distribuio acumulada:
54 Variveis aleatrias no uniformes
1.00
0.85
(0.55)
(0.20)
0
U
20 40 60
B
2 100
A
2
x
90
y
1
y
2
Usando interpolao linear e semelhana de tringulos, temos:
x A
2
B
2
A
2
=
U Y
1
Y
2
Y
1
Podemos tirar ento o valor de X:
x = A
2
+
_
U Y
1
Y
2
Y
1
_
[B
2
A
2
] ou generalizando,
x = A
j
+
_
U Y
j1
Y
j
Y
j1
_
[B
j
A
j
]
O nosso 1
o
nmero aleatrio, 0.35, cai na 2
a
faixa (j = 2), porque maior que 0.20
e menor que 0.55. Assim temos:
x = A
2
+
_
U Y
1
Y
2
Y
1
_
[B
2
A
2
] = 70 +
0.35 0.20
0.55 0.20
[80 70] = 74.29
De maneira semelhante podemos calcular os outros nmeros, obtendo:
j U
i
X
i
1 0.35 $74.29
2 0.97 98.00
3 0.22 70.57
4 0.15 67.50
5 0.60 81.67
6 0.43 76.57
Poderamos usar interpolao polinomial em vez de linear. Teramos melhor preci-
so na obteno dos valores de x.
4.1 O Mtodo da Transformao Inversa 55
4.1.2 A Distribuio Exponencial
Muitos problemas de simulao necessitam usar a distribuio exponencial. Isto
verdadeiro nos problemas que envolvem chegadas e partidas (filas), como a si-
mulao de uma agncia bancria, da sada (caixas) de um supermercado, de um
aeroporto, etc...
A funo de densidade probabilstica da exponencial igual a:
f(x) = e
x
onde uma constante conhecida e a mdia () igual a
1
.
A funo de distribuio acumulada dada por:
F(x) = 1 e
x
De modo a se fazer uso do mtodo da transformao inversa devemos resolver para
x. Assim temos:
x =
1
ln[1 F(x)]
Como a funo acumulada, F(x), uniformemente distribuda em [0, 1], a quanti-
dade 1 F(x) tambm ser uniformemente distribuda em [0, 1]. Assim podemos
escrever
x =
_
1
_
ln(U)
onde x a varivel aleatria exponencialmente distribuda e U um nmero alea-
trio uniformemente distribudo em [0, 1], gerado por um gerador bsico.
Suponha agora que x deve ser maior ou igual a um determinado valor positivo, x
0
,
isto 0 < x
0
< x. A equao acima fica:
x = x
0
_
1
_
ln(U)
Tambm a relao entre e torna-se:
=
1
( x
0
)
Exemplo: Gerar 6 variveis exponencialmente distribudas maiores que 2 e com
mdia igual a 6, usando os seguintes nmeros uniformemente distribudos em
[0, 1]: 0.35, 0.97, 0.22, 0.15, 0.60, 0.43. Temos ento: x
0
= 2 e = 6.
Calculando o valor de :
=
1
(6 2)
= 0.25
Podemos ento calcular as variveis da distribuio exponencial:
56 Variveis aleatrias no uniformes
X
1
= 2
_
1
0.25
_
ln(0.35) = 6.20
X
2
= 2
_
1
0.25
_
ln(0.97) = 2.12
Os demais valores encontrados so:
i U
i
X
i
1 0.35 6.20
2 0.97 2.12
3 0.22 8.06
4 0.15 9.59
5 0.60 4.04
6 0.43 5.38
O programa a seguir, escrito em Pascal, implementa a gerao de nmeros aleat-
rios que seguem a distribuio exponencial.
O programa permite que se informe quantos nmeros queremos gerar, o limite in-
ferior da distribuio e a mdia.
Como sada ele imprime os 5 primeiros nmeros gerados e a mdia de todos os n-
meros gerados.
O programa usa a RAND2 como o gerador bsico de nmeros aleatrios.
{EXPONENCIAL}
{$N+}
{ $E+}
Var
ISER, N,PARAM, I ,NUMIMP: Integer ;
U,SOMA: Double;
LIMINF,ALFA,MEDIA: Real ;
{ $I RAND2. PAS}
{ }
Function EXPONENCIAL (ALFA, LIMINF: Real ; U: Double ) : Double;
Begin
EXPONENCIAL : = LIMINF ( 1/ALFA) LN(U) ;
End;
{ }
Begin
PARAM : = 0;
Writeln( Qual a Serie (0 a 21473) ? ) ;
Readln( ISER) ;
U : = RAND2( ISER,PARAM) ;
PARAM : = 1;
Writeln( Quantos Numeros ? ) ;
Readln(N) ;
Writeln( Qual o LIMITE INFERIOR ? ) ;
Readln(LIMINF) ;
Writeln( Qual a Media ? ) ;
Readln(MEDIA) ;
ALFA : = 1. 0 / (MEDIA LIMINF) ;
SOMA : = 0. 0;
4.1 O Mtodo da Transformao Inversa 57
NUMIMP : = 0;
For I : = 1 to N do
Begin
U : = RAND2( ISER,PARAM) ;
U : = EXPONENCIAL(ALFA, LIMINF,U) ;
NUMIMP : = NUMIMP + 1;
If NUMIMP < 6 then Writeln(U) ;
SOMA : = SOMA + U;
End;
Writeln( MEDIA = ,SOMA / N) ;
End.
Emuma execuo, usando-se a srie 1234 da RAND2, emque foramgerados 10.000
nmeros com limite inferior igual a 2 e mdia igual a 6, os seguintes resultados
foram apresentados:
Primeiros 5 nmeros gerados: 3.27141; 3.841; 7.65564; 3.50536 e 5.19165.
Mdia dos 10.000 nmeros gerados: 5.97737.
4.1.3 A Distribuio Geomtrica
Vamos agora considerar uma sequncia de experincias independentes, onde o re-
sultado de cada experincia um sucesso ou um insucesso. Suponha que p a
probabilidade de sucesso de cada experincia (0 < p < 1), e q = (1 p) a
probabilidade de insucesso. A probabilidade de x insucessos at um sucesso dada
por:
f(x) = pq
x
onde x deve ser um inteiro no negativo, isto x = 1, 2, ...
A equao acima representa a densidade probabilstica para a distribuio geom-
trica, cuja mdia dada por:
=
q
p
e cuja varincia dada por:
2
=
q
p
2
=
p
A distribuio cumulativa correspondente pode ser expressa por:
F(x) = f(0) +f(1) +f(2) +. . . +f(x)
= p +pq +pq
2
+. . . +pq
x
=
x
k=0
pq
k
58 Variveis aleatrias no uniformes
Observe que F(0) = p e p F(x) 1.
De maneira a se usar o mtodo da transformao inversa ns devemos expressar a
distribuio cumulativa de uma forma um pouco diferente.
Para fazer isto observamos que:
Prob(X > 0) = 1 F(0) = 1 p = q
Prob(X > 1) = 1 F(0) F(1) = 1 p pq = 1 p p(1 p) = 1 p p +p
2
= 1 2p +p
2
= (1 p)
2
= q
2
.
.
.
Prob(X > x) = 1 F(x) = q
x+1
onde X uma varivel aleatria geomtricamente distribuda. Assim ns podemos
escrever:
1 F(x)
q
= q
x
Ns sabemos que F(x) uniformemente distribuda dentro do intervalo [p, 1].
A diferena 1 F(x) ser uniformemente distribuda em [1 p, 0] ou [0, 1 p] ou
[0, q].
Logo a funo
[1 F(x)]
q
ser uniformemente distribuda sobre o intervalo [0,1].
Como [1 F(x)] = q
x+1
temos que
q
x+1
q
, ou seja q
x
uniformemente distribuda
em [0, 1]. Logo podemos escrever:
U = q
x
onde U uma varivel aleatria uniformemente distribuda no intervalo [0, 1]. Re-
solvendo para x obtemos:
x = Inteiro
_
ln U
ln q
_
onde x ser o valor da distribuio geomtrica.
Exemplo: Gerar 6 variveis aleatrias, geomtricamente distribudas, para um
processo cuja probabilidade de sucesso de 30%. Use os seguintes nmeros aleat-
rios uniformemente distribudos em [0, 1]: 0.35, 0.97, 0.22, 0.15, 0.60, 0.43.
Como p = 0.3 ns sabemos que q = 1 p = 0.7. Logo podemos usar:
X
1
= Inteiro(ln 0.35/ ln 0.70) = 2
X
2
= Inteiro(ln 0.97/ ln 0.70) = 0
4.1 O Mtodo da Transformao Inversa 59
Os 6 nmeros gerados so:
U
i
X
i
0.35 2
0.97 0
0.22 4
0.15 5
0.60 1
0.43 2
O programa a seguir, escrito em Pascal, implementa a gerao de nmeros alea-
trios que seguem a distribuio geomtrica.
O programa permite que se informe quantos nmeros queremos gerar e a probabi-
lidade de sucesso.
Como sada ele imprime os 5 primeiros nmeros gerados,a mdia e o desvio padro,
calculado pela frmula
_
(x
2
i
)/n x
2
, dos nmeros gerados.
O programa usa a RAND2 como o gerador bsico de nmeros aleatrios.
{GEOMETRICA}
{$N+}
{ $E+}
Var
ISER, N,PARAM, I ,NUMIMP, J : Integer ;
U,SOMA: Double;
SUCESSO, INSUCESSO,MEDIA, DESVIO: Real ;
{ $I RAND2. PAS}
{ }
Function GEOMETRICA (INSUCESSO: Real ; U: Double ) : Integer ;
Begin
GEOMETRICA : = TRUNC(LN(U) / LN(INSUCESSO) ) ;
End;
{ }
Begin
PARAM : = 0;
Writeln( Qual a Serie (0 a 21473) ? ) ;
Readln( ISER) ;
U : = RAND2( ISER,PARAM) ;
PARAM : = 1;
Writeln( Quantos Numeros ? ) ;
Readln(N) ;
Writeln( Qual a probabilidade de sucesso ? ) ;
Readln(SUCESSO) ;
INSUCESSO : = 1 SUCESSO;
SOMA : = 0. 0;
DESVIO : = 0. 0;
NUMIMP : = 0;
For I : = 1 to N do
Begin
U : = RAND2( ISER,PARAM) ;
J : = GEOMETRICA(INSUCESSO,U) ;
NUMIMP : = NUMIMP + 1;
60 Variveis aleatrias no uniformes
If NUMIMP < 6 then Writeln( J ) ;
SOMA : = SOMA + J ;
DESVIO : = DESVIO + J J ;
End;
Writeln( MEDIA = ,SOMA / N) ;
Writeln( DESVIO PADRAO = ,SQRT( ( DESVIO/N)(SOMA/N) (SOMA/N) ) ) ;
End.
Emuma execuo, usando-se a srie 1234 da RAND2, emque foramgerados 10.000
nmeros com probabilidade de sucesso igual a 0.30, ou seja com mdia terica igual
a
q
p
=
1 0.30
0.30
= 2.3333 e =
_
p
=
2, 3333
0, 30
= 2, 7886, os seguintes
resultados foram obtidos:
Primeiros 5 nmeros gerados: 0, 1, 3, 1 e 2.
A mdia dos 10.000 nmeros gerados foi igual a 2,3201.
O desvio padro obtido foi igual a 2,73416.
4.1.4 A Distribuio Triangular
A distribuio Triangular tem um uso bastante difundido em Simulao, principal-
mente quando os dados disponveis so poucos ou mesmo inexistentes.
Sua forma permite que dados no conclusivos sejam a ela adaptados, e seus limites,
ou seja A (limite inferior), C (moda) e B (limite superior) sejam interpretados como
os parmetros mais pessimista (A), mais provvel (C) e mais otimista (B) de uma
determinada varivel, como pode ser visto na figura a seguir.
f(x)
A
B
C
x
Sua funo de densidade dada por:
f(x) =
2(x A)
(C A)(B A)
para A x C
=
2(B x)
(B C)(B A)
para C x B
4.1 O Mtodo da Transformao Inversa 61
Podemos usar o Mtodo da Transformao Inversa mas a descontinuidade da fun-
o faz com que seja necessrio desenvolver 2 geradores separados: um para x C
e um para x C. Inicialmente vamos desenvolver um para x C.
A funo de distribuio acumulada F(x) igual a:
F(x) =
_
x
A
2(x A)
(C A)(B A)
dx
=
x
2
2Ax +A
2
(C A)(B A)
Como F(x) e U (gerado por uma RAND), variam em [0 , 1], podemos escrever:
U =
x
2
2Ax +A
2
(C A)(B A)
Fazendo as simplificaes necessrias, chegamos a :
x = A+
_
U(C A)(B A)
Esta frmula pode ser usada se U <
(C A)
(B A)
, pois a razo
(C A)
(B A)
proporcio-
nal a rea sob o tringulo de x = A at x = C.
Para x C temos:
F(x) = U =
_
x
C
2(B x)
(B C)(B A)
dx
U =
x
2
+ 2Bx B
2
(B C)(B A)
+ 1
Operando, para obter o valor de x, obtemos:
x = B
_
(1 U)(B C)(B A)
Esta frmula deve ser usada quando U
(C A)
(B A)
.
A media e o desvio padro da Distribuio Triangular so:
x =
A+B +C
3
=
A
2
+B
2
+C
2
AB AC BC
18
62 Variveis aleatrias no uniformes
Exemplo: Gerar 3 variveis aleatrias seguindo a Distribuio Triangular com li-
mite inferior (A) igual a 2, moda (C) igual a 4 e limite superior (B) igual a 8. Use
os seguintes nmeros aleatrios uniformemente distribudos em [0, 1]: 0.35, 0.97,
0.22.
A frmula a ser usada depende se o valor de U maior ou menor que
(C A)
(B A)
ou
seja
(4 2)
(8 2)
= 0.3333. Assim para o 1
o
U, 0.35 (maior que 0.33) temos:
X
1
= 8
_
(1 0.35)(8 4)(8 2) = 4.050
Para 0.97 (maior) temos:
X
2
= 8
_
(1 0.97)(8 4)(8 2) = 7.151
Para 0.22 (menor) temos:
X
3
= 2 +
_
0.22(4 2)(8 2) = 3.624
O programa a seguir, escrito em Pascal, implementa a gerao de nmeros aleat-
rios que seguem a distribuio triangular.
O programa permite que se informe quantos nmeros queremos gerar e os 3 par-
metros (A,B e C) da distribuio.
Como sada ele imprime os 5 primeiros nmeros gerados, a mdia e o desvio padro
dos nmeros gerados.
O programa usa a RAND2 como o gerador bsico de nmeros aleatrios.
{TRIANGULAR}
{$N+}
{ $E+}
Var
ISER, N,PARAM, I ,NUMIMP: Integer ;
U,SOMA: Double;
A, B, C,MEDIA, DESVIO, T: Real ;
{ $I RAND2. PAS}
{ }
Function TRIANGULAR (A, B, C : Real ;U : Double ) : Real ;
Begin
If (U < ( ( CA) / ( BA) ) ) then
TRIANGULAR : = A + Sqrt (U(CA) ( BA) )
Else TRIANGULAR : = B Sqrt ((1U) ( BC) ( BA) ) ;
End;
{ }
BEGIN
PARAM : = 0;
Writeln( Qual a Serie (0 a 21473) ? ) ;
Readln( ISER) ;
U : = RAND2( ISER,PARAM) ;
PARAM : = 1;
Writeln( Quantos Numeros ? ) ;
Readln(N) ;
Writeln( Qual o limite inferior (A) ? ) ;
Readln(A) ;
Writeln( Qual o limite superior (B) ? ) ;
Readln(B) ;
Writeln( Qual a moda (C) ? ) ;
Readln(C) ;
4.1 O Mtodo da Transformao Inversa 63
SOMA : = 0. 0;
DESVIO : = 0. 0;
NUMIMP : = 0;
For I : = 1 to N do
Begin
U : = RAND2( ISER,PARAM) ;
T : = TRIANGULAR(A, B, C,U) ;
NUMIMP : = NUMIMP + 1;
If NUMIMP < 6 then Writeln( T) ;
SOMA : = SOMA + T;
DESVIO : = DESVIO + T T;
End;
Writeln( MEDIA = ,SOMA / N) ;
Writeln( DESVIO PADRAO = ,SQRT( ( DESVIO/N)(SOMA/N) (SOMA/N) ) ) ;
END.
Emuma execuo, usando-se a srie 1234 da RAND2, emque foramgerados 10.000
nmeros com os parmetros A = 2, B = 8 e C = 4 da triangular, os seguintes
resultados foram obtidos:
Primeiros 5 nmeros gerados: 5.4436, 5.0246, 3.7082, 5.2564 e 4.3677.
A mdia dos 10.000 nmeros gerados foi igual a 4,66286. A mdia terica igual a
4,66666.
O desvio padro obtido foi igual a 1,239. O desvio padro terico igual a 1,247.
4.1.5 A Distribuio de Weibull
A Distribuio de Weibull tem larga aplicao na rea industrial pois inmeros re-
sultados, principalmente sobre a de vida til de um componente, tem mostrado que
variveis que medem este tipo de resultado se ajustam muito bem a esta distribui-
o terica.
Ela tem 2 parmetros: que reflete o tamanho da unidade na qual a varivel ale-
atria x medida e que d a forma (shape) da distribuio.
Sua funo de densidade acumulada F(x) igual a:
F(x) = 1 e
para x, , > 0
Sua mdia e desvio padro so:
x =
_
1
+ 1
_
=
2
_
_
2
+ 1
_
_
1
+ 1
__
2
_
Podemos usar a transformao inversa para gerar variveis aleatrias seguindo a
Distribuio de Weibull. Temos ento:
U = F(x) = 1 e
i=1
E
i
, ento para o intervalo t, temos:
S
k
t < s
k+1
, onde k a varivel Poisson, com mdia t, ou seja o nmero de
chegadas no intervalo t (k = 3 no exemplo grfico acima).
J vimos (pgina 55) que podemos gerar variveis exponencialmente (E
i
) atravs
da relao:
E
i
=
1
ln U
i
Logo a varivel poisson o menor valor de k que garante que:
t
k
i=1
E
i
ou
t
k
i=1
ln U
i
que pode ser escrita como:
t
k
i=1
ln U
i
ou
t ln
k
i=1
U
i
Fazendo t = 1 e exponenciando ambos os lados chegamos a:
k
i=1
U
i
e
Assim sendo, a varivel poisson o menor valor de k que garante a relao acima
ou (k 1) quando na execuo do produtrio, acontece:
k
i=1
U
i
> e
x
(1)
e
x
( 1)!
onde uma constante positiva e uma constante inteira positiva. Pode ser
mostrado que a mdia e a varincia para a distribuio so:
=
2
=
2
=
Pode-se mostrar ainda que a varivel x pode ser interpretada como a soma de
variveis aleatrias exponencialmente distribudas, cada uma tendo um valor es-
perado de
1
. Assim,
x = x
1
+x
2
+. . . +x
onde
f(x
i
) = e
x
i
A funo de densidade probabilstica para a distribuio gamma no pode ser inte-
grada analticamente e consequentemente o mtodo da transformao inversa no
pode ser usado. Ns podemos, entretanto, simular o processo gamma diretamente,
somando variveis aleatrias exponencialmente distribudas. Assim podemos es-
crever:
X =
_
1
i=1
ln U
i
onde U
i
uma varivel aleatria uniformemente distribuda em [0, 1].
A expresso pode ser escrita de uma forma mais conveniente como:
X =
_
1
_
ln
i=1
U
i
desde que o logartimo de um produto a soma dos logartimos dos fatores indivi-
duais.
Com a equao acima podemos construir a rotina bsica para a gerao de vari-
veis seguindo a distribuio Gamma:
70 Variveis aleatrias no uniformes
INCIO
P = 1
Lao de 1 a
Beta
Obter U
i
P= P * U
i
G=-(1/ alfa ) Ln P
Devemos observar que a distribuio gamma reduz-se distribuio exponencial
quando = = 1.
Exemplo: Gerar 5 variveis governadas pela distribuio gamma com = 1 e
= 2. Faa os clculos usando o seguinte conjunto de variveis aleatrias unifor-
memente distribudas em [0, 1]: 0.35, 0.97, 0.22, 0.15, 0.60, 0.43, 0.79, 0.52, 0.81,
0.65.
X
1
= (1/1) ln [(0.35)(0.97)] = 1.08
X
2
= (1/1) ln [(0.22)(0.15)] = 3.41
X
3
= (1/1) ln [(0.60)(0.43)] = 1.35
X
4
= (1/1) ln [(0.79)(0.52)] = 0.89
X
5
= (1/1) ln [(0.81)(0.65)] = 0.64
O programa a seguir, escrito em Pascal, implementa a gerao de nmeros aleat-
rios que seguem a distribuio gamma.
O programa permite que se informe quantos nmeros queremos gerar, e .
Como sada ele imprime os 5 primeiros nmeros gerados e a mdia de todos os n-
meros gerados.
O programa usa a RAND2 como o gerador bsico de nmeros aleatrios.
{GAMMA}
{$N+}
{ $E+}
Var
ISER, N,PARAM, I ,NUMIMP,BETA: Integer ;
U,SOMA: Double;
ALFA,MEDIA: Real ;
{ $I RAND2. PAS}
{ }
Function GAMMA (ALFA: Real ; BETA : Integer ; U: Double; ISER,PARAM: Integer ) : Double;
Var
NUMGAMMA: Double;
4.2 Simulao Direta 71
J : Integer ;
Begin
NUMGAMMA : = 1. 0;
For J : = 1 to BETA do
Begin
U : = RAND2( ISER,PARAM) ;
NUMGAMMA : = NUMGAMMA U;
End;
GAMMA : = ( 1.0 / ALFA) LN(NUMGAMMA) ;
End;
{ }
Begin
PARAM : = 0;
Writeln( Qual a Serie (0 a 21473) ? ) ;
Readln( ISER) ;
U : = RAND2( ISER,PARAM) ;
PARAM : = 1;
Writeln( Quantos Numeros ? ) ;
Readln(N) ;
Writeln( Qual o valor de Alfa ? ) ;
Readln(ALFA) ;
Writeln( Qual o valor de Beta ? ) ;
Readln(BETA) ;
SOMA : = 0. 0;
NUMIMP : = 0;
For I : = 1 to N do
Begin
U : = GAMMA(ALFA, BETA, U, ISER,PARAM) ;
SOMA : = SOMA + U;
NUMIMP : = NUMIMP + 1;
If NUMIMP < 6 then Writeln(U) ;
End;
Writeln( MEDIA = ,SOMA / N) ;
End.
Emuma execuo, usando-se a srie 1234 da RAND2, emque foramgerados 10.000
nmeros com = 1 e = 2 , ou seja com mdia terica igual a =
=
2
1
= 2,
os seguintes resultados foram obtidos:
Primeiros 5 nmeros gerados: 0.7781; 1.79025; 2.83951; 2.58164 e 0.812912.
A mdia dos 10.000 nmeros gerados foi igual a 2.00018.
72 Variveis aleatrias no uniformes
4.2.3 A distribuio Normal
Muitos tipos de eventos aleatrios so governados pela distribuio Normal. Esta
distribuio caracterizada por uma densidade probabilstica dada por:
f(x) =
1
2
e
1
2
2
onde a mdia e o desvio padro. A funo de densidade normal no pode
ser integrada analticamente e desta forma no podemos usar o mtodo da trans-
formao inversa. Podemos, entretanto, uma vez mais, gerar a varivel aleatria
desejada por simulao direta.
Para fazer isto considere o caso especial onde = 1 e Z =
(x )
.
Temos ento:
f(Z) =
1
2
e
Z
2
2
Esta a funo de densidade probabilstica para a distribuio normal padroni-
zada (standard).
Pelo teorema do limite central sabemos que a soma de N variveis aleatrias uni-
formemente distribudas em [0, 1] segue uma distribuio Normal com =
N
2
e
=
_
N
12
.
Podemos escrever:
Z =
N
i=1
U
i
N
2
_
N
12
Como esta considerao vlida para N > 10, podemos fazer N = 12 para facili-
tar o procedimento computacional, obtendo ento:
Z =
12
i=1
U
i
6
Temos agora um procedimento simples para gerar uma varivel aleatria nor-
malmente padronizada. Simplesmente somamos 12 nmeros aleatrios uniforme-
mente distribudos em [0, 1] e ento subtramos 6, obtendo um valor para Z. Se de-
sejarmos gerar uma varivel normal com mdia e desvio padro , geramos pri-
meiro Z e ento calculamos a varivel aleatria desejada X usando: X = +Z.
Exemplo: Gerar uma varivel aleatria que siga a distribuio normal com mdia 5
e desvio padro 2. Use o seguinte conjunto de variveis aleatrias uniformemente
distribudas em [0, 1]: 0.35, 0.97, 0.22, 0.15, 0.60, 0.43, 0.79, 0.52, 0.81, 0.65, 0.20,
0.57.
4.2 Simulao Direta 73
A soma dos 12 nmeros d:
12
i=1
U
i
= 0.35 + 0.97 +. . . + 0.57 = 6.26
Calculamos ento o valor de Z = (6.26 6) = 0.26.
A varivel aleatria normal pode ento ser obtida por:
X = 5 + (2)(0.26) = 5.52
O programa a seguir, escrito em Pascal, implementa a gerao de nmeros aleat-
rios que seguem a distribuio Normal.
O programa permite que se informe quantos nmeros queremos gerar, a mdia e
o desvio padro .
Como sada ele imprime os 6 primeiros nmeros gerados, a mdia de todos os n-
meros gerados e o desvio padro.
O programa usa a RAND2 como o gerador bsico de nmeros aleatrios.
{NORMAL I }
{$N+}
{ $E+}
Var
ISER, N,PARAM, I ,NUMIMP, J : Integer ;
U,SOMA, Z, DESVIO: Double;
MU,DELTA: Real ;
{ $I RAND2. PAS}
{ }
Function NORMAL(MU,DELTA: Real ;U: Double; ISER,PARAM: Integer ) : Double;
Var
SOMA12 : Double;
Begin
SOMA12 : = 0. 0;
For J : = 1 to 12 do
Begin
U : = RAND2( ISER,PARAM) ;
SOMA12 : = SOMA12 + U;
End;
NORMAL : = MU + DELTA (SOMA12 6. 0) ;
End;
{ }
Begin
PARAM : = 0;
Writeln( Qual a Serie (0 a 21473) ? ) ;
Readln( ISER) ;
U : = RAND2( ISER,PARAM) ;
PARAM : = 1;
Writeln( Quantos Numeros ? ) ;
Readln(N) ;
Writeln( Qual a media ? ) ;
Readln(MU) ;
Writeln( Qual o desvio padrao ? ) ;
Readln(DELTA) ;
SOMA : = 0. 0;
NUMIMP : = 0;
DESVIO : = 0. 0;
For I : = 1 to N do
Begin
74 Variveis aleatrias no uniformes
Z : = NORMAL(MU,DELTA, U, ISER,PARAM) ;
SOMA : = SOMA + Z;
DESVIO : = DESVIO + ( Z Z ) ;
NUMIMP : = NUMIMP + 1;
If NUMIMP < 6 then Writeln( Z ) ;
End;
Writeln( MEDIA = ,SOMA / N) ;
DESVIO : = SQRT( ( DESVIO / N) (SOMA /N) (SOMA / N) ) ;
Writeln( DESVIO PADRAO = ,DESVIO) ;
END.
Emuma execuo, usando-se a srie 1234 da RAND2, emque foramgerados 10.000
nmeros com = 5 e = 2, os seguintes resultados foram obtidos:
Primeiros 5 nmeros gerados: 5.60458, 4.2534, 4.63261, 3.92964 e 6.6514.
A mdia () dos 10.000 nmeros gerados foi igual a 4,994.
O desvio padro () foi igual a 1,998.
Um mtodo alternativo para gerar variveis aleatrias normalmente distribudas
usar uma das seguintes expresses:
Z =
_
(2 ln U
1
) sin (2U
2
)
ou
Z =
_
(2 ln U
1
) cos (2U
2
)
Ambas as expresses geram variveis aleatrias normais padronizadas.
Observe que o mtodo anterior necessita de 12 valores de U
i
para cada valor de
Z enquanto que este ltimo s necessita de 2. Assim aparenta ser mais eficiente
do ponto de vista computacional mas o clculo de logartimo, raiz quadrada e seno
(ou coseno) muito mais demorado que uma soma. Na verdade os 2 mtodos se
equivalem em termos de tempo computacional.
Exemplo: Gere 2 nmeros aleatrios que sigam uma distribuio normal com m-
dia 5 e desvio padro 2. Use o seguinte conjunto de nmeros aleatrios uniforme-
mente distribudos em [0, 1]: 0.35, 0.97, 0.22, 0.15.
Temos ento:
Z
1
=
_
(2) ln (0.35) sin [(2)(0.97)] = 0.27
X
1
= 5 + (2)(0.27) = 4.46
Z
1
=
_
(2) ln (0.22) sin [(2)(0.15)] = 1.41
X
2
= 5 + (2)(1.41) = 7.82
O programa a seguir, escrito em Pascal, implementa a gerao de nmeros aleat-
rios que seguem a distribuio Normal utilizando a frmula do seno.
O programa permite que se informe quantos nmeros queremos gerar, a mdia e
o desvio padro .
Como sada ele imprime os 6 primeiros nmeros gerados, a mdia de todos os n-
meros gerados e o desvio padro.
O programa usa a RAND2 como o gerador bsico de nmeros aleatrios.
4.2 Simulao Direta 75
{NORMAL I I }
{$N+}
{ $E+}
Var
ISER, N,PARAM, I ,NUMIMP: Integer ;
U,SOMA, Z, DESVIO: Double;
MU,DELTA: Real ;
{ $I RAND2. PAS}
{ }
Function NORMAL(MU,DELTA: Real ;U: Double; ISER,PARAM: Integer ) : Double;
Begin
U : = SQRT(( 2.0 LN(RAND2( ISER,PARAM) ) ) ) SIN( 2. 0 PI
RAND2( ISER,PARAM) ) ;
NORMAL : = MU + DELTA U;
End;
{ }
Begin
PARAM : = 0;
Writeln( Qual a Serie (0 a 21473) ? ) ;
Readln( ISER) ;
U : = RAND2( ISER,PARAM) ;
PARAM : = 1;
Writeln( Quantos Numeros ? ) ;
Readln(N) ;
Writeln( Qual a media ? ) ;
Readln(MU) ;
Writeln( Qual o desvio padrao ? ) ;
Readln(DELTA) ;
SOMA : = 0. 0;
NUMIMP : = 0;
DESVIO : = 0. 0;
For I : = 1 tO N dO
Begin
Z : = NORMAL(MU,DELTA, U, ISER,PARAM) ;
SOMA : = SOMA + Z;
DESVIO : = DESVIO + ( Z Z ) ;
NUMIMP : = NUMIMP + 1;
If NUMIMP < 6 then Writeln( Z ) ;
End;
Writeln( MEDIA = ,SOMA / N) ;
DESVIO : = SQRT( ( DESVIO / N) (SOMA /N) (SOMA / N) ) ;
Writeln( DESVIO PADRAO = ,DESVIO) ;
End.
Emuma execuo, usando-se a srie 1234 da RAND2, emque foramgerados 10.000
nmeros com = 5 e = 2, os seguintes resultados foram obtidos:
Primeiros 5 nmeros gerados: 3.82918, 1.902, 6.83981, 4.57527 e 3.6889.
A mdia () dos 10.000 nmeros gerados foi igual a 5,01063.
O desvio padro () foi igual a 1,98415.
76 Variveis aleatrias no uniformes
4.3 O Mtodo da Rejeio
O Mtodo da Rejeio um procedimento geral para gerar variveis aleatrias
para qualquer distribuio cuja densidade probabilstica f(x) contnua e limi-
tada dentro de uma regio finita, isto , necessitamos que 0 f(x) f
max
dentro
do intervalo a x b.
De maneira a se obter a varivel aleatria X, deve-se proceder da seguinte forma:
1. Gerar um par (U
1
, U
2
) de nmeros aleatrios uniformemente distribudos em
(0,1).
2. Obter uma varivel aleatria, K, dentro do intervalo a K b, usando a
relao K = a + (b a) U
1
.
3. Avaliar a densidade probabilstica no ponto K, isto , determinar f(K).
4. Obter uma varivel aleatria, Y , uniforme dentro do intervalo 0 Y
f
max
, usando a relao Y = f
max
U
2
. Os pontos Y e K representam as
coordenadas de algum ponto no espao como ilustrado nas figuras a seguir:
f(x)
0
f
mx
Y
f(K)
K
Y < F(K), logo
aceitamos K
a b x
f(x)
0
f
mx
Y
F(K)
K
Y > F(K), logo
no aceitamos K
a b x
4.3 O Mtodo da Rejeio 77
5. Comparar Y com f(K).
Se Y no maior que f(K) ento o ponto (Y, K) cair em cima ou abaixo
da curva de densidade probabilstica como indicado na primeira figura acima.
Neste caso ns aceitamos K como a varivel aleatria desejada, ou seja, faze-
mos X = K.
Se Y maior que f(K), rejeitamos o ponto.
6. As etapas de 1 a 5 so repetidas sucessivamente at ser encontrado um ponto
que satisfaa a condio.
O procedimento est ilustrado no fluxo a seguir:
REJEIO
Gerar
U
1
e U
2
K=a+(b-a)*U
1
Y=F
mx
* U
2
Y < f(K) ?
X = K
Sim
No
Embora o mtodo da rejeio possa ser usado com muitas distribuies diferentes,
ele ineficiente por causa das diversas tentativas que se tem que fazer para se
obter uma varivel aleatria desejada. Por esta razo s deve ser usado se no
existir outro mtodo.
78 Variveis aleatrias no uniformes
4.3.1 A Distribuio Beta
Para ilustrar o uso do mtodo da rejeio, vamos considerar a distribuio Beta.
Esta distribuio tem a densidade probabilstica dada por:
f(x) =
(
1
+
2
1)!x
(
1
1)
(1 x)
(
2
1)
(
1
1)!(
2
1)!
onde
1
e
2
so inteiros positivos e 0 x 1.
Pode ser mostrado que a mdia e a varincia para esta distribuio so:
=
1
(
1
+
2
)
2
=
2
(
1
+
2
) + (
1
+
2
+ 1)
Alm disto pode ser estabelecido que a varivel x pode ser interpretada como:
x =
x
1
x
1
+x
2
onde x
1
uma varivel gamma com parmetros (,
1
) e x
2
uma varivel gamma
com parmetros (,
2
).
Exemplo: O modo mais fcil de gerar uma varivel aleatria Beta usar simulao
direta. Vamos no entanto, como exemplo, usar o mtodo da rejeio. Em particular
vamos gerar vrias variveis beta com
1
= 2 e
2
= 3, baseado na seguinte
sequncia de nmeros aleatrios uniformemente distribudos em (0,1): 0.35, 0.97,
0.22, 0.15, 0.60, 0.43, 0.79, 0.52, 0.81, 0.65, 0.20, 0.57.
Como 0 x 1, ento a = 0 e b = 1. Logo:
K = a + (b a) U
1
= 0 + (1 0) U
1
= U
1
A funo de densidade probabilstica pode ser escrita como:
f(x) =
(2 + 3 1)!x
(21)
(1 x)
(31)
(2 1)!(3 1)!
= 12x(1 x)
2
A funo toma seu valor mximo em x =
1
3
. Assim sendo, temos:
f
max
= 12
_
1
3
__
3
3
_
2
=
16
9
= 1.78
Como Y igual f
max
U
2
, temos:
Y = 1.78 U
2
Os resultados obtidos com a aplicao do mtodo esto mostrados a seguir:
4.3 O Mtodo da Rejeio 79
U
1
U
2
K f(K) Y Y f(K)? X
0.35 0.97 0.35 1.77 1.73 SIM 0.35
0.22 0.15 0.22 1.61 0.27 SIM 0.22
0.60 0.43 0.60 1.15 0.77 SIM 0.60
0.79 0.52 0.79 0.42 0.93 NO
0.81 0.65 0.81 0.35 1.16 NO
0.20 0.57 0.20 1.54 1.01 SIM 0.20
Assim com 12 nmeros aleatrios em [0, 1], ns geramos 4 variveis beta cujos va-
lores so 0.35, 0.22, 0.60 e 0.20.
O programa a seguir, escrito em Pascal, implementa a gerao de nmeros aleat-
rios que seguem a distribuio Beta utilizando o mtodo da rejeio.
O programa permite que se informe quantos nmeros queremos gerar, o valor de
a, b e F
max
.
Como sada ele imprime os 5 primeiros nmeros gerados, a mdia de todos os n-
meros gerados e o desvio padro.
Ele imprime tambm quantos nmeros aleatrios em [0, 1] foram necessrios.
O programa usa a RAND2 como o gerador bsico de nmeros aleatrios.
{BETA}
{$N+}
{ $E+}
Var
ISER, N,PARAM, I ,NUMIMP: Integer ;
J : Longint ;
U: Double;
A, B,MEDIA,FMAX, K, Y,SOMA, DESVIO,NUMBETA: Real ;
{ $I RAND2. PAS}
Begin
PARAM : = 0;
Writeln( Qual a Serie (0 a 21473) ? ) ;
Readln( ISER) ;
U : = RAND2( ISER,PARAM) ;
PARAM : = 1;
Writeln( Quantos Numeros ? ) ;
Readln(N) ;
Writeln( Qual o valor de A ? ) ;
Readln(A) ;
Writeln( Qual o valor de B ? ) ;
Readln(B) ;
Writeln( Qual o valor de Fmax ? ) ;
Readln(FMAX) ;
SOMA : = 0. 0;
NUMIMP : = 0;
DESVIO : = 0. 0;
I : = 0;
J : = 0;
While I < N do
Begin
U : = RAND2( ISER,PARAM) ;
J : = J +1;
80 Variveis aleatrias no uniformes
K : = A + (B A) U;
U : = RAND2( ISER,PARAM) ;
J : = J + 1;
Y : = FMAX U;
If Y < (12 K ( 1 K) ( 1 K) ) then
Begin
I : = I + 1;
NUMBETA : = K;
SOMA : = SOMA + NUMBETA;
DESVIO : = DESVIO + NUMBETA NUMBETA;
NUMIMP : = NUMIMP + 1;
If NUMIMP < 6 then Writeln(NUMBETA) ;
End;
End;
Writeln( Usados , J , numeros aleatorios ) ;
Writeln( MEDIA = ,SOMA / N) ;
SOMA : = SOMA / N;
DESVIO : = SQRT( ( DESVIO / N) (SOMA SOMA) ) ;
Writeln( Desvio Padrao = ,DESVIO) ;
End.
Emuma execuo, usando-se a srie 1234 da RAND2, emque foramgerados 10.000
nmeros com a = 0, b = 1 e F
max
= 1.78, os seguintes resultados foram obtidos:
Primeiros 5 nmeros gerados: 0.24319; 0.450268; 0.146248; 0.238159 e 0.291242.
A mdia () dos 10.000 nmeros gerados foi igual a 0.403384. Devemos observar
que a mdia terica igual a:
=
1
+
2
=
2
2 + 3
= 0.4
O desvio padro () foi igual a 0.200465. Devemos observar que o desvio padro
terico igual a:
=
2
(
1
+
2
)(
1
+
2
+ 1)
=
0.4 3
(2 + 3)(2 + 3 + 1)
= 0.2
Para se gerar os 10.000 nmeros beta, foramnecessrios 35.804 nmeros aleatrios
gerados pela RAND2, o que mostra a ineficincia do mtodo.
4.4 Outras funes de distribuio
Vimos algumas das funes de distribuio mais importantes. Devemos assina-
lar que existem mtodos e formas de gerar variveis aleatrias para praticamente
qualquer distribuio conhecida e estudada.
Captulo 5
Modelos para simular filas de espera e o uso do ARENA
Neste captulo veremos, inicialmente, 2 programas que permitem a simulao de
alguns modelos de filas de espera. A seguir, veremos uma introduo ao ARENA,
que um programa para se construir e simular modelos no ambiente Windows.
5.1 Simulao de um pequeno posto bancrio
Veremos uma aplicao construda para simular o funcionamento de um pequeno
posto bancrio com uma nico caixa e uma nica fila.
Dados obtidos por amostragem indicam que o intervalo entre chegadas de clientes
segue uma Distribuio Exponencial e a durao do servio prestado, pelo caixa,
tambm segue uma Distribuio Exponencial.
O programa a seguir, escrito em Pascal, implementa a simulao desejada e utiliza
a RAND2 como o gerador de nmeros aleatrios uniformemente distribudos.
Neste tipo de simulao, em que temos 2 eventos aleatrios (intervalo entre che-
gadas e durao do servio), devemos utilizar 2 sries diferentes, uma para cada
tipo de evento. Se o gerador usado fosse, por exemplo a RAND1, deveramos usar
2 sementes para termos 2 geraes distintas.
{ Fila com 1 servi dor : Int erval o ent re chegadas : Exponencial
Ex . Posto bancario Duracao do s e r vi c o : Exponencial
com 1 caixa
Usada RAND2 como gerador de nos . al e at or i os [ 0 , 1] .
_
1
3
, 0 x 2
1
24
, 2 < x 10
0, x > 10
9) Com uma calculadora que tenha a funo para gerar nmeros aleatrios uni-
formemente distribudos em [0, 1], gere 10 nmeros seguindo a distribuio de
Poisson com mdia () igual a 2, 5.
122 Modelos para simular filas de espera e o uso do ARENA
10) Modifique o programa da pgina 48 para calcular a probabilidade de um valor
(x) de uma distribuio normal, com mdia () igual a 1.500 e desvio padro
() igual a 300, estar entre 1.300 e 1.800. Use, no programa, a frmula da
distribuio normal:
f(x) =
1
2
2
e
(X )
2
2
2
Compare o valor obtido pela simulao com o valor obtido da tabela normal.
11) A gerente de uma loja de eletro-domsticos est desconfiada que o seu estoque
de foges est acima do que seria necessrio. Antes de modificar a poltica de
estoques, ela registrou o nmero de foges vendidos, diariamente, nos ltimos
25 dias. Os dados encontrados esto mostrados a seguir:
Foges vendidos 2 3 4 5 6
Nmero de dias 4 7 8 5 1
a) Use os dados para estimar a distribuio de probabilidade das vendas dirias
de foges.
b) Calcule a mdia da distribuio obtida na parte (a).
c) Descreva como nmeros aleatrios uniformemente distribudos em [0, 1] po-
dem ser usados para simular as vendas dirias.
d) Usando os nmeros aleatrios 0.4475, 0.9713 e 0.0629, simule as vendas di-
rias de 3 dias.
e) Usando uma planilha eletrnica (Excel, por exemplo), faa um modelo para
simular as vendas dirias. Realize 300 replicaes e obtenha a mdia de
vendas dirias.
12) Utilizando como sementes os valores 1234, 76545, 88787, 77712, 564783 e 5434
encontre os 3 primeiros nmeros gerados pela RAND4.
13) Pesquise e descubra os comandos para a gerao de nmeros aleatrios no Turbo
Pascal, inclusive com a escolha da semente.
14) Utilizando uma planilha eletrnica (Excel, por exemplo), construa um modelo
para a seguinte situao: Um posto de gasolina do governo, que tem somente
uma bomba de gasolina, est sempre aberto e tem 2 tipos de clientes. Uma
ambulncia chega, exatamente, a cada 30 minutos, com o 1
o
carro chegando
no instante, 15 minutos. Carros de outras reparties pblicas, que no so
ambulncias, chegam com um intervalo mdio entre chegadas, exponencial, de
5, 6 minutos, com o 1
o
carro chegando no instante 0. O tempo de servio, para
todos os tipos de carros, tem uma mdia de 4, 8 minutos (exponencial).
Um carro que chega e encontra a bomba vazia vai ser atendido imediatamente
enquanto que os que chegam com a bomba ocupada, formam uma fila nica.
Isto s no vale para as ambulncias que, ao chegar, vo imediatamente para o
5.4 Exerccios 123
incio da fila (assuma que, se j tem uma ou mais ambulncias no incio da fila,
esta nova chegada passa a ser a 1
a
da fila). Considere que no incio da simulao
(instante 0), o posto est vazio. Execute a simulao at que 500 carros, no total,
tenham sido atendidos. Estime o tempo de espera mdio na fila para os 2 tipos
de carro, o nmero mdio de carros na fila para os 2 tipos de carro e a taxa de
ocupao da bomba de gasolina.
15) Desenvolva um modelo para um sistema com 2 processos consecutivos (I e II).
Os tens chegamao sistema comintervalo, mdio, entre chegadas de 10 minutos.
Assim que chegam, os tens so imediatamente enviados para o processo I que
temuma fila ilimitada e umrecurso simples comuma durao, mdia, do servio
de 9 minutos. Aps terminar o 1
o
processo, os tens so enviados para o processo
II que idntico ao processo I. Aps o servio do processo II ser completado,
os tens deixam o sistema. As medidas de interesse no sistema so o nmero
mdio de tens na fila, em cada processo, e o tempo total, mdio, que um tem
permanece no sistema. Usando 10.000 minutos como a durao a ser estudada,
faa as 4 simulaes a seguir e compare os resultados.
a) Intervalo entre chegadas exponencial e durao do servio exponencial.
b) Intervalo entre chegadas exponencial e durao do servio constante.
c) Intervalo entre chegadas constante e durao do servio exponencial.
d) Intervalo entre chegadas constante e durao do servio constante.
16) Peas chegam a uma estao de trabalho com um intervalo, mdio, entre che-
gadas de 21 segundos (exponencial). Aps a chegada, as peas so processadas.
O tempo de processamento segue uma distribuio triangular com parmetros
16, 19 e 22. Existem caractersticas visuais que determinam se uma pea tem
um eventual problema de qualidade. Esto peas, que so cerca de 10% do total,
so enviadas para outra estao onde sofrem uma rigorosa inspeo. As demais
(90%) so enviadas para a expedio e consideradas boas.
A distribuio do tempo de inspeo rigorosa , em mdia, igual a 95 segundos
mais uma varivel aleatria que segue uma distribuio de Weibull com par-
metros iguais a 48,5 e 4,04. Em torno de 14% das peas que sofrem inspeo,
so reprovadas e viram sucata. As demais vo para a expedio.
Execute a simulao para 10.000 segundos para determinar o nmero de peas
boas, o nmero de peas sucateadas e o nmero de peas que so inspecionadas
parcialmente e rigorosamente.
17) Clientes chegam a uma caixa com um intervalo, mdio, entre chegadas igual
a 10 minutos (exponencial). Um nico funcionrio recebe o pagamento alm
de conferir o pedido. Ele demora, em mdia, entre 8 a 10 minutos para fazer
estas tarefas, variando a durao uniformemente naquele intervalo. Aps esta
atividade estar completada, o cliente , aleatoriamente, atribudo a um de 2
funcionrios do estoque que separam e embalam a mercadoria para entregar
ao cliente. O tempo desta atividade tambm uniformemente distribudo entre
124 Modelos para simular filas de espera e o uso do ARENA
16 e 20 minutos. Cada um dos 2 funcionrios do estoque s podem atender
clientes que foram designados para ele. Aps receber sua mercadoria, o cliente
vai embora.
Desenvolva um modelo e rode a simulao para 5.000 minutos.
H uma sugesto de que os 2 funcionrios possam atender qualquer cliente que
ficariam em uma fila nica esperando atendimento. Rode a simulao tambm
para 5.000 minutos e compare os resultados.
Apndice A
Tabela do
2
0,25 0,10 0,05 0,025 0,01 0,005 0,001