Programação C
Autor: Verdade @bsoluta Data: 15/out./2005
Formato: html
- Geração de números randômico
Visão geral
Números randômicos são uteis para diferentes
necessidades de aplicações, eles podem ser utilizados em
simulações para criação de ambientes, teste
de eficiênca de algoritmos, programação de jogos,
geração de chaves para criptografá básica,
primos é mais recomndável, entre outras. Mas geralmente a
geração de números randômicos gera
confusão, quando analisado a forma de geração dos
mesmos por computadores.
A primeira questão a esclarecer é que números
randômicos gerados por computador de fato não são
randômicos.Analisando de forma estritamente abstrata, não
existe números randômicos, mas de forma realista um
número randômico é uma sequencia independente de
valoes com uma distribuição específica, ou seja,
obtidos atravez de chance e sem relação com os outros
números da sequencia.
Uma boa distribuição de número randômico
é uma sequencia na qual a probabilidade da ocorrência de
cada número é a mesma para todos, ou seja em um
domínio de 1 a 10, cada número irá ocorre 1/10
vezes, sendo a sequencia uniforme.
Como dito anteriormente, o computador não pode criar
números randômicos, mas pode simular o efeito de
criação de sequencias que parecem randômico,
são os chamados números pseudo-randômico.
Parte 1 - função rand() no C
O C possui diversas funções para a geração
de números pseudo-randômico, rand()/srand(), rand_r(),
random()/srandom(), rand48()/srand48(), etc. Aqui iremos tratar do
aprofundamento na função rand()
rand() - Gera número pseudo-randômico
com módulo 2^31, no domínio de 0 a RAND_MAX. A
função usa um valor semente (seed) para gerar o
número pseudo-randômico. A semente tem o valor inicial 1,
mas pode modificado através da chamada a srand().
#include
int rand(void);
Originalmente a função rand() foi definida em
sistemas BSD, sendo a sequencia:
x_{n+1} = (x_n * a + c) mod m
com a = 1103515245, c = 12345 and m = 2^31. A semente, como dito, a
semente
define o valor inicial, x_n. A função rand() faz
parte do padrão ANSI C e é portável para outros
ambientes.
int rand()
{
rand_seed = rand_seed * 1103515245 + 12345;
return (unsigned int) (rand_seed / 65536) % 32768;
}
Por padrão, todas as vezes que o programa é inicializado,
a mesma série de números pseudo-randômico é
retornada. Este comportamento é importante em algumas
aplicações, pois permite reproduzir o mesmo resultado,
facilitando encontrar erros. Mas outras vezes é importante
ter-se como retorno sequencia diferente, como por exemplo em
criptografia. Neste caso a cada chamada a semente deve possuir um valor
diferente, para isso utiliza-se a função srand().
srand (time (NULL));
Parte 2 - Linear Congruential Random Number Generator
Você pode estar se perguntando, de onde/como foram definidos os
valores abaixo, que são utilizados na função rand()
x_{n+1} = (x_n * a + c) mod m
com a = 1103515245, c = 12345 and m = 2^31.
int rand()
{
rand_seed = rand_seed * 1103515245 + 12345;
return (unsigned int) (rand_seed / 65536) % 32768;
}
Os valores de x_n e m, esta claro. Já a origem
dos valores a e c, é explicado abaixo:
http://www.absoluta.org
---oOo--- verdade@absoluta.org
Copyright © 1998 - 2006 Verdade
@bsoluta