Esta página mostra as diferenças entre as duas revisões da página.
Próxima revisão | Revisão anterior | ||
algoritmo:aleatorio [2007/09/27 09:04] 127.0.0.1 external edit |
algoritmo:aleatorio [2021/12/12 12:39] (Atual) staff |
||
---|---|---|---|
Linha 1: | Linha 1: | ||
- | ===== Geração de n.º pseudo-aleatórios == | + | ====== Geração de Números |
- | Imaginem que querem fazer o seu programa e querem ter uma função que gera números aleatórios ao seu gosto. | + | Imaginem que querem fazer o vosso programa e querem ter uma função que gera números aleatórios ao vosso gosto. |
- | Por exemplo | + | Por exemplo, gerar valores pseudo-aleatórios com distribuição uniforme entre **]0,1]** ou uma distribuição gaussiana de média nula e de variância unitária (ruído branco). Imaginem que não têm qualquer função que gerasse |
- | A necessidade | + | A necessidade |
+ | A geração de ruído branco inicia-se com uma fórmula para produzir números aleatórios distribuídos uniformemente no intervalo ]0,1]. Aplicando transformações convenientes na sequência distribuída uniformemente, | ||
- | A geração de ruído branco inicia-se com uma fórmula para produzir | + | Um dos métodos preferidos para a geração de números aleatórios, |
- | Um dos métodos preferidos para a geração de números aleatórios, designado por método congruencial, usa a seguinte fórmula recursiva. | + | < |
+ | com k = 1, 2, ... | ||
- | <code>X(k) = [[A|x X(k - 1)]] modulo M; k = 1, 2, ...</code> | + | Na fórmula, **A** é um inteiro entre **1** e **M**, em que **M** é um número primo ou uma potência inteira de um número primo, |
- | onde A é um inteiro entre 1 e M, em que M é um número primo ou uma potência inteira de um número primo, pm. A geração de números aleatórios começa com a utilização da " | + | Para um gerador congruencial multiplicativo, |
- | + | ||
- | + | ||
- | Para um gerador congruencial multiplicativo, | + | |
- | + | ||
- | < | + | |
+ | <m>A = 8k +- 3</m> | ||
(sendo //k// um número inteiro) | (sendo //k// um número inteiro) | ||
+ | No caso de termos um gerador congruencial normal e a assumindo que o valor do módulo **M** é suficientemente grande - um bom exemplo seria < | ||
+ | * **A > 0**; **C > 0**. | ||
+ | * **C** é primo relativo de **M**; O maior divisor comum de **C** e **M** é **1**. | ||
+ | * Para todos os factores primos, **p**, de **M**, **p** necessita igualmente de ser factor de **A-1**. | ||
+ | * **4** precisa de ser um factor de **A-1** se **4** for um factor de **M**. | ||
- | No caso de termos um gerador congruential normal | + | Se <m>M = 2^b</m>, podemos simplificar para as seguintes |
- | * A > 0; C > 0 | + | * <m>A = 4k + 1</m>, onde **k** é um inteiro positivo |
- | * C é primo relativo de M; O maior divisor comum de C e M é 1. | + | * **C = ímpar** |
- | * Para todos os factores primos, p, de M, p necessita igualmente de ser factor de A-1. | + | |
- | * 4 precisa de ser um factor de A-1 se 4 for um factor de M. | + | |
+ | Seja agora **X1** e **X2**, duas variáveis aleatórias independentes distribuídas uniformemente no intervalo < | ||
- | Se M = 2^b, podemos simplicar para as seguintes duas condições: | + | < |
- | * A = 4k + 1, onde k é um inteiro positivo | + | < |
- | * C = ímpar | + | |
+ | são variáveis aleatórias gaussianas, independentes, | ||
+ | Este algoritmo, que permite obter um par de v.a. gaussianas a partir de um par de v.a. distribuídas uniformemente é conhecido por método de Box-Muller. | ||
+ | Note-se que as equações anteriores produzem números distribuídos no intervalo < | ||
- | Seja agora X1 e X2, duas variáveis aleatórias independentes distribuídas uniformemente no intervalo [[0;|1]]. Então Y1 e Y2 definido por: | + | <note normal>// |
- | Y1 = [[-2ln(X1)]]1/ | + | <dtopic 2558 Geração de números pseudo-aleatórios |
- | Y2 = [[-2ln(X2)]]1/ | + | |
- | + | ||
- | são variáveis aleatórias gaussianas, independentes, | + | |
- | + | ||
- | Este algoritmo, que permite obter um par de v.a. gaussianas a partir de um par de v.a. distribuídas uniformemente é conhecido por método | + | |
- | Note-se que as equações anteriores produzem números distribuídos no intervalo ]] - inf; + inf[[.|Se m for o menor número real positivo que pode ser representado num dado computador, então o algoritmo produzirá números no intervalo ]] - a; a[[|com a = [[-2 ln(m)]]1/2. | + | |
- | **Nota:** //X módulo Y//, é o resto da divisão entre //X// e //Y//! | + | {{tag> |