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