08.02.2015 Views

Programação Funcional e Concorrente com Scheme

Programação Funcional e Concorrente com Scheme

Programação Funcional e Concorrente com Scheme

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

notas de aula - Jerônimo C. Pellegrini<br />

( expt 2 32))))<br />

O procedimento linear-congruencial recebe os parâmetros do gerador e um número;<br />

o procedimento next-random é uma barreira de abstração sobre linear-congruencial.<br />

Precisaremos de um número inicial a partir do qual possamos gerar números<br />

aleatóreos. Este número é chamado de semente. É <strong>com</strong>um usar o relógio interno do<br />

<strong>com</strong>putador, por exemplo, <strong>com</strong>o semente para o gerador de números aleatóreos.<br />

Podemos também gerar números aleatóreos de ponto flutuante, dividindo o valor<br />

obtido de next-random por 2 32 − 1, que é o maior número aleatóreo que poderemos gerar:<br />

( define next-real-random<br />

( lambda (x)<br />

(/ ( next-random x)<br />

(- ( expt 2 32) 1))))<br />

O procedimento next-real-random gerará números entre 0 e 1. Este não é o melhor<br />

método, mas nos servirá.<br />

É fácil obter números aleatórios de ponto flutuante em outros intervalos, bastando<br />

que multipliquemos o aleatório entre 0 e 1 pelo tamanho do intervalo que quisermos. No<br />

entanto, a geração de números aleatóreos inteiros em um intervalo arbitrário não é tão<br />

simples.<br />

Se quisermos um número entre 0 e k poderíamos tentar gerar um número x ∈ [0, 2 32 )<br />

usando next-random e usar x mod k, mas infelizmente este método não garante que<br />

a distribuição dos números gerados continua uniforme quando k não é divisor de 2 32 .<br />

Trataremos disso na seção sobre repetições.<br />

Pode parecer estranho que um gerador de números aleatóreos tenha a propriedade de<br />

transparência referencial – afinal de contas, queremos que o resultado deste procedimento<br />

seja imprevisível! No entanto, esta imprevisibilidade (que aliás é limitada) é garantida<br />

pela escolha da semente a partir da qual os próximos números são gerados. Esta sim, pode<br />

ser obtida a partir de forma imprevisível: para aplicações simples pode-se usar o relógio<br />

interno do <strong>com</strong>putador, por exemplo. O fato de a semente determinar <strong>com</strong>pletamente<br />

toda a sequência de números nos permite fazer algo bastante útil: podemos reproduzir o<br />

<strong>com</strong>portamento de um programa que usa números aleatóreos, desde que guardemos a<br />

semente usada para o gerador.<br />

O leitor interessado em geração de números aleatóreos encontrará uma breve introdução<br />

à geração de números aleatóreos para fins de simulação no livro de Reuven [14]<br />

Versão Preliminar<br />

[ 27 de outubro de 2010 at 15:47 ]<br />

13

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!