domingo, 17 de agosto de 2014

Gerando números "aLeaTóRIos" com Scilab


Já faz um tempo que as tabelas de números aleatórios (na verdade pseudo-aleatórios) estão em desuso, embora ainda existam (um exemplo aqui). Essas tabelas eram criadas através de experimentos com dados, roletas ou cartas antes do advento da computação. Livros com centenas de páginas formado por tabelas de números "aleatórios" já foram produzidos (desconfio que a leitura não era muito empolgante). Esses números encontram muitas aplicações em estatística, matemática e engenharia, notadamente na simulação de sistemas de comunicação.

Hoje, é muito mais prático usar um software para gerar números pseudo-aleatórios. Uma das formas mais comuns para geração desses números é usando o Método da Congruência Multiplicativa: $X_{n+1} = k . X_n$ mod $m$. O Scilab possui um gerador comando "básico" para gerar números aleatórios: rand - gerador de números randômico. Exemplo:

x = rand(1,5)
 x  =

    0.2113249    0.7560439    0.0002211    0.3303271    0.6653811

No exemplo acima, são gerados números com uma distribuição uniforme entre 0 e 1. O Scilab, contudo, possui um comando muito mais sofisticado de gerar números aleatórios seguindo uma determinada distribuição (beta, uniforme, Laplace, geométrica, normal, ...), o grand.

Um trecho do "Help" do Scilab:

grand

Random numbers

Calling Sequence

Y = grand(m, n, "bet", A, B)
Y = grand(m, n, "bin", N, p)
Y = grand(m, n, "nbn", N, p)
Y = grand(m, n, "chi", Df)
Y = grand(m, n, "nch", Df, Xnon)
Y = grand(m, n, "exp", Av)
...

Arguments

m, n, o: integers, size of the wanted matrix / hypermatrix Y.
X: a matrix or hypermatrix whom only the dimensions (say m-by-n) are used.
Y: depending on the input, a matrix or hypermatrix, with random entries.
S: output of the action (a string or a real column vector).

Description

This function generates random numbers from various distributions.       
-------------------------------
----------------
-------
Alguns exemplos simples:
  • x = sign(rand(1,1000,'n'));   > gera 1000 números +1 ou -1 (50% de cada);
  • y = rand(1,200,'u'); > gera 200 números distribuídos entre 0 e 1, com distribuição uniforme;
  • z = grand(m, n, "unf", Low, High); > gera uma matriz m x n de números aleatórios (não inteiros) uniformemente distribuídos entre Low e High.
Um exemplo um pouco mais completo:

x = sign(rand(1,1000,'n')) + %i*sign(rand(1,1000,'n'));
n = rand(1,1000,'n') + %i*rand(1,1000,'n');
n = n - mean(n);
y = x + 0.1*n;
plot(real(y),imag(y),'.');  title('4-QAM com ruído');
xlabel('Eixo real');  ylabel('Eixo imaginário');

Resulta:


Nenhum comentário:

Postar um comentário