Enviado por Do utilizador1211

Geração de números pseudo-aleatórios

Propaganda
Simulação
Geração de números pseudo-aleatórios
Prof. Afonso Sales
Escola Politécnica – PUCRS
Tópicos
Introdução
— Geração de números pseudo-aleatórios
— Métodos geradores
— Exercícios
—
Introdução
—
Simulação
◦ Imita o comportamento de um sistema
◦ Possui um certo grau de aleatoriedade
◦ Emulação x Simulação
– reprodução exata x aproximada
Simulação
—
Vantagens
◦ Aproximação de um sistema real
◦ Resultados de qualidade, se o simulador for bem
implementado
—
Desvantagens
◦ Deve possuir um bom gerador de números pseudoaleatórios
◦ Alto esforço de programação
◦ Início da simulação possui alta variabilidade (warming up)
◦ Difícil determinar condições de parada (stop criteria)
◦ Longas execuções (long runs)
Caracterização
—
Determinístico ou estocástico?
◦ “estocástico” refere-se a sistemas nãodeterminísticos
◦ Modelo contém eventos aleatórios?
Espaço de estados contínuo ou
discreto?
— Estado do sistema evolui
continuamente ou em pontos discretos
do tempo?
—
Tempo Contínuo x Tempo Discreto
Tempo Contínuo
Tempo Discreto
Simulação
—
Antes de falar de simulação...
◦ Simuladores utilizam variáveis aleatórias
◦ Noção fundamental em simulação (processo
estocástico)
—
Processos aleatórios
◦ Processo repetitivo sem padrão determinístico
conhecido
◦ Entretanto, segue uma distribuição de
probabilidade
◦ Faz com que a saída seja aproximada ou até
mesmo computada
Exemplo
—
Jogar o dado de seis faces
◦ Antes de jogar, não é possível saber qual
será o resultado
◦ Mas de conhecimento prévio que sua
probabilidade é igual a 1/6
◦ Um dado perfeito (não viciado) possui a
mesma chance para qualquer face
Geração de números pseudoaleatórios
—
Noções gerais
◦ Um computador é uma máquina
determinística
◦ Objetivo: gerar números que dêem a
aparência de serem aleatórios (por isso
chamados de pseudo-aleatórios)
“Any one who considers arithmetical methods of
producing random digits is, of course, in a state of sin.”
John von Neumann, 1949
Exemplo
—
Atirar uma moeda (cara ou coroa)
◦ Pode ser um evento determinístico?
—
Usando funções seed e random de uma
linguagem de programação
◦ Por que se preocupar com uma “semente”?
Características de bons geradores
—
Sequência aparenta ser aleatória
◦ Verificação pode ou não ser complicada
◦ Quando o ciclo começa a se repetir?
—
Garantir um longo ciclo antes de uma
repetição
◦ Técnicas para aumentar o tamanho do ciclo
—
Ser computacionalmente fácil de ser
calculado
—
Problemas
◦ Antecipação de valores, determinismo
◦ Perda de desempenho (tempo de cálculo)
◦ Perdas (ou ganhos?) monetários (e.g., jogos de azar)
Exemplo prático
Dada a aparente aleatoriedade do
número π, utilizar como gerador
— Funcionamento: calculo π com n casas
e “recorto” números
—
Exemplo prático
—
Primeiras 256 casas de π (recorte de 4
números)
—
Problemas
◦ Números são bastante conhecidos e estudados
◦ Cálculo de novos valores de π é um gargalo
computacional
◦ 100.000 dígitos de π
http://www.geom.uiuc.edu/~huberty/math5337/groupe/digits.html
Métodos geradores de números
pseudo-aleatórios
1.000 números com tamanho 4 a partir dos dígitos após a vírgula de π
Métodos geradores de números
pseudo-aleatórios
—
Middle Square (“quadrado do meio”)
◦ Não é muito bom como método em si, mas
sim pelo seu valor histórico
Método Congruente
— Método Congruente Linear
— ...
—
java.util.Random: uma instância desta classe é usada para gerar uma
sequência de números pseudo-aleatórios. Esta classe usa uma semente
de 48 bits e segue uma fórmula congruente linear. (Veja Donald Knuth:
“The Art of Computer Programming”, Volume 2, Seção 3.2.1)
Middle Square
(“quadrado do meio”)
—
—
Método simples para gerar números
pseudo-aleatórios
Procedimento para gerar um número com
n dígitos
1. Escolha uma semente inicial de n dígitos (n>=4)
– e.g., 1234
2. Calcule n2
– Resultado: 01522756 (número de n+n dígitos, se não for,
então adicione zeros à esquerda)
3. Use como próximo número os n números do meio
– Neste caso: 01522756
4. Repita os passos 1 a 3 para gerar o próximo número
Casos “problemáticos”: 1000, 9999, etc
Middle Square
(“quadrado do meio”)
200 números com tamanho 4 a partir de 9999
Middle Square
(“quadrado do meio”)
120 números com tamanho 4 a partir de 1391
Middle Square
(“quadrado do meio”)
Exercício: dada a semente 5437, produza os 10
primeiros números aleatórios usando o método
middle square.
1. 54372 = 29560969
2. 56092 = 21460881
3. 46082 = 21233664
4. 23362 = 05456896
5. 45682 = 20866624
6. 86662 = 75099556
7. 09952 = 00990025
8. 99002 = 98010000
9. 01002 = 00010000
Método Congruente
Sejam a e M dois parâmetros inteiros
— Seja X0 uma semente (um valor inicial)
—
—
Detalhes
◦ X0 determina a sequência inteira
◦ M determina o valor máximo gerado pela
sequência
Exemplo
Suponha a = 3, M = 11 e X0 = 4
— Quantos números podem ser gerados
antes de começar a repetir?
—
X1 = 3X0 mod 11 = 3 x 4 mod 11 =
1
X2 = 3X1 mod 11 = 3 x 1 mod 11 =
3
X3 = 3X2 mod 11 = 3 x 3 mod 11 =
9
X4 = 3X3 mod 11 = 3 x 9 mod 11 =
Método Congruente Linear
—
—
Sejam a, c e M três parâmetros inteiros
Seja X0 uma semente (um valor inicial)
—
Detalhes
◦ X0 determina a sequência inteira
◦ M determina o valor máximo gerado pela
sequência
◦ c é uma constante usada para maior variação
dos números gerados
Exemplo
Determine as sequência de números pseudoaleatórios produzidos para a = 4, M = 9 e c = 4.
Indique o tamanho do ciclo usando X0 = 7.
X1 = (4X0 + 4) mod 9 = (4 x 7 + 4) mod 9 = 5
X2 = (4X1 + 4) mod 9 = (4 x 5 + 4) mod 9 = 6
X3 = (4X2 + 4) mod 9 = (4 x 6 + 4) mod 9 = 1
X4 = (4X3 + 4) mod 9 = (4 x 1 + 4) mod 9 = 8
X5 = (4X4 + 4) mod 9 = (4 x 8 + 4) mod 9 = 0
X6 = (4X5 + 4) mod 9 = (4 x 0 + 4) mod 9 = 4
X7 = (4X6 + 4) mod 9 = (4 x 4 + 4) mod 9 = 2
X8 = (4X7 + 4) mod 9 = (4 x 2 + 4) mod 9 = 3
X9 = (4X8 + 4) mod 9 = (4 x 3 + 4) mod 9 = 7
Exemplo
Sem usar a constante c, como seria então a
sequência de números pseudo-aleatórios
produzidos para a = 4, M = 9, c = 4 e X0 = 7.
X1 = 4X0 mod 9 = 4 x 7 mod 9 = 1
X2 = 4X1 mod 9 = 4 x 1 mod 9 = 4
X3 = 4X2 mod 9 = 4 x 4 mod 9 = 7
Em linguagens de programação
—
C/C++
◦ Incluir nos headers:
– #include <time.h>
– #include <cstdlib>
◦ Semente: srand (time(NULL));
– Tempo do relógio (estrutura time_t)
◦ n = (float) rand() / RAND_MAX;
– número entre 0 e 1
Em linguagens de programação
—
Java
◦ Pacote java.util.Random;
◦ Contrutores:
– Random();
– Random(long seed);
◦ Uso:
– double nd = r.nextDouble();
– int ni = r.nextInt();
Diversas linguagens de programação possuem funções
e métodos para gerar números pseudo-aleatórios
Alguns geradores e seus
parâmetros
Gerador
M
a
c
Numerical Recips
232
glibc (GCC)
232
1.103.515.245
12.345
bits 30..0
Microsoft VB
224
1.140.671.485
12.820.163
-
java.util.Random
248
25.214.903.917
11
bits 47..16
1.664.525 1.013.904.223
bits
-
Fonte: http://en.wikipedia.org/wiki/Linear_congruential_generator
Outras sequências interessantes
de números aleatórios
—
Movimentos Brownianos
◦ Baseado no movimento de partículas
◦ Diversas aplicações em computação (e.g., Randow
Walk)
—
HotBits
◦ Números aleatórios genuínos, gerados por
decaimento radioativo
◦ http://www.fourmilab.ch/hotbits/
◦ Funciona à base de requisições para um servidor
◦ Não manda a mesma sequência para diferentes
clientes do serviço
—
Outras... (e.g., Mersenne twister, etc)
Recapitulando...
Vantagens x desvantagens do uso de
simulação
— Conceitos sobre espaço e tempo
— Métodos de geração de números
pseudos-aleatórios
— Principais desafios no uso destes
métodos
—
Simulação
Geração de números pseudo-aleatórios
Prof. Afonso Sales
Escola Politécnica – PUCRS
Download