Você está na página 1de 12

Tcnico em Informtica

Estrutura de Dados

Gerao de Nmeros Aleatrios


Alex Helder Cordeiro de Oliveira
Instituto Federal de Braslia -

Campus

Braslia

2o semestre de 2013

Alex Helder (IFB)

EDD - Nmeros Aleatrios

2013/2

1 / 12

Gerao de Nmero Aleatrio


A gerao de nmeros aleatrios ou de sequncias de nmeros
aleatrios extremamente importante na informtica, sendo usada
em:
jogos;
criptograa e segurana;
data mining;

estatsticas;
teste de software;
e muitos outros.

Para obter um nmero aleatrio em C, usamos a funo rand().


main() {
int i;
for(i = 0; i < 10; i++) {
int n = rand();
printf("%d\n", n);
}
}

Encontrado no exemplo: rand.c.


Alex Helder (IFB)

EDD - Nmeros Aleatrios

2013/2

2 / 12

Nmeros Aleatrios?

Alex Helder (IFB)

EDD - Nmeros Aleatrios

2013/2

3 / 12

Nmeros Pseudo-Aleatrios

O computador um conjunto de circuitos deterministicos;


No possvel gerar um valor (ou sequncia de valores)
verdadeiramente aleatrio;
possvel entretanto gerar uma sequncia de nmeros que, para os
usurios parea com uma sequncia de nmeros aleatrios.
Esta chamada de uma sequncia de nmeros pseudo-aleatrios .
A sequncia de nmeros pseudo-aleatrios obtida pela execuo de
diversas funes matemticas sobre um nmero, chamado de semente.
A semente padro usada pelo C `0'.

Pseudo: do grego, o que nge ser ou tenta se passar pelo que no .


Alex Helder (IFB)

EDD - Nmeros Aleatrios

2013/2

4 / 12

Ajustar a semente

Para ajustar a semente de gerao de nmeros pseudo-aleatrios,


deve-se usar a funo srand().
Qual argumento deve-se usar?
0?
Um nmero qualquer, como 5?
Usar um nmero gerado pela funo rand()?

necessrio usar algum nmero que seja diferente para cada vez que
executamos o programa.
Sugesto: Horrio do sistema.

Alex Helder (IFB)

EDD - Nmeros Aleatrios

2013/2

5 / 12

Ajustar a semente - Horrio do Sistema


Sugesto: Horrio do sistema.
Pode ser obtido pela funo time(NULL), disponvel na biblioteca
time.h.
#include <time.h>
main() {
int horario = time(NULL);
srand(horario);
int n = rand();
printf("%d\n", n);
}

Encontrado no exemplo: comSemente.c.


Alex Helder (IFB)

EDD - Nmeros Aleatrios

2013/2

6 / 12

Intervalo da Gerao

No DevCpp:
de 0 a 32.767
so 15 bits aleatrios.
No GCC do Linux:
de 0 a 2.147.483.647
so 31 bits aleatrios.
Em nenhum dos dois casos, so gerados nmeros negativos.

Alex Helder (IFB)

EDD - Nmeros Aleatrios

2013/2

7 / 12

Para limitar o intervalo

Podemos usar a operao de mdulo:


Se quisermos limitar, por exemplo de 0 a 100:
int aleatorio = rand()%101;
Se quisermos limitar de 0 a n:
int aleatorio = rand()%(n+1);

Alex Helder (IFB)

EDD - Nmeros Aleatrios

2013/2

8 / 12

Para limitar o intervalo

Se quisermos limitar, por exemplo de 1 a 100:


int aleatorio = rand()%100 + 1;
Se quisermos limitar de i a n:
int aleatorio = rand()%(n-i+1) + i;

Alex Helder (IFB)

EDD - Nmeros Aleatrios

2013/2

9 / 12

Com valores de ponto utuante


A gerao feita pela funo rand() devolve um nmero inteiro.
Podemos usar divises para obter casas decimais.
Para a melhor preciso, podemos dividir pelo maior nmero aleatrio
possvel.
Para gerarmos um nmero do tipo ponto utuante de 0 a 1:
double n = (double)rand()/RAND_MAX;
Para gerarmos um nmero do tipo ponto utuante de 0 a 100:
double n = ((double)rand()/RAND_MAX)*100;

Encontrado no exemplo: aleatorioPontoFlutuante.c.


Alex Helder (IFB)

EDD - Nmeros Aleatrios

2013/2

10 / 12

Todos os bits aleatrios

Se for necessrio usar a varivel com todos os bits aleatrios, utilize


uma das funes presentes no arquivo fullRand.c, de autoria do
professor:
fullIntRand()
fullIntRandForDevCpp()
fullFloatRand()
fullDoubleRand()

Alex Helder (IFB)

EDD - Nmeros Aleatrios

2013/2

11 / 12

Sua Vez...

(1.0 pontos) - Questo 11: Escreva um programa que gere uma senha
aleatria composta por 6 dgitos.

Alex Helder (IFB)

EDD - Nmeros Aleatrios

2013/2

12 / 12

Você também pode gostar