Вы находитесь на странице: 1из 4

Universidade Federal do Mato Grosso do Sul UFMS

Sistemas de InIormao






ALGORITMOS E PROGRAMAO I










Classe Random














ProI Simone Araujo





Acadmica: Karina Kazumi Hirata

1 Semestre



UFMS COXIM/MS
Classe Random

O conceito da seqncia aleatria limita-se a obter um numero aps o outro, tal que o
numero seguinte imprevisvel dada a seqncia de nmeros j escolhidos antes. A
seqncia aleatria o processo implementado comumente em API de apoio em linguagens
de programao e em Java representado pela classe java.util.Random. Esta classe o que se
chama de um Gerador de Nmeros Aleatrios, mas de fato um gerador de seqncias
aleatrias.
A gerao de seqncias aleatrias com Random no to aleatria assim. A gerao baseia-
se num algoritmo que parte de um numero e gera outro. Esse primeiro numero chamado
de semente (800/, em ingls). Diz-se que este tipo de seqncia pseudo-aleatria porque
tentar prever essa gerao "no brao demasiado complexo para ser feito na prtica mas
no impossvel. Portanto, a gerao no verdadeiramente aleatria. Para quase todos os
fins prticos este tipo de gerao suficiente, mas para aplicaes em segurana no . Por
isso existe a classe $0.ur0Random que implementa algoritmos mais difceis de prever.
Uma utilidade muito importante das seqncias pseudo-aleatrias a capacidade de repetir
a mesma seqncia caso seja necessrio. Random suporta o conceito de semente. Portanto,
criando o objeto com a mesma semente ser produzida a mesma seqncia. Isto de
extrema importncia em algoritmos como o Teste de Montecarlo onde queremos produzir
nmeros aleatoriamente, mas queremos produzir sempre os mesmos a cada execuo do
teste para obter repetibilidade.
Objetos da classe Random geram seqncias de quase todos os tipos primitivos em java
nomeadamente: boolean, int, long, float e double. O contra-dominio (ou seja, o conjunto de
nmeros possveis de serem gerados) das seqncias aleatrias limitado entre 0.0 (zero) e
1.0 (um) para doubl0 e 1loat. Para os outros tipos o contradomnio so todos os valores
possveis para esse tipo de varivel em Java. A gerao feita tal que todos os valores
possveis tm igual probabilidade.
O conceito de sorteio o de um processo em que um dos possveis valores escolhido de
entre todos os outros. O sorteio pode ser com repetio ou sem repetio.
Imagine que tem uma sacola de pano preto de forma que o seu interior no pode ser visto
de fora. So colocadas bolas dentro dessa sacola, uma para cada numero possvel de ser
sorteado. O sorteio o processo em que uma pessoa coloca a mo na sacola e retira uma
bola. Aps o numero na bola ser visto a bola pode, ou no, voltar para dentro do saco. Se
voltar estamos perante um sorteio com repetio. Se no voltar estamos perante um sorteio
sem repetio. A loteria, por exemplo, um processo de sorteio sem repetio.
A diferena de um processo de seqncia aleatria para um de sorteio que em um sorteio
ns escolhemos o conjunto de nmeros possveis ao invs de utilizar todo o intervalo de um
certo tipo de varivel.
Simular um sorteio com o auxilio de um computador no utiliza uma sacola de pano preto,
mas pode utilizar outra implementao de um conjunto: uma coleo.
Para comear podemos pensar numa coleo dos nmeros que queremos sortear. O sorteio
simulado pela escolha de um desses elementos da coleo. Esse o numero sorteado. Em
um sorteio com repetio o elemento devolvido coleo. em um processo sem repetio
o elemento descartado e no devolvido coleo.
Contudo, se simplesmente adicionarmos os elementos na coleo e depois os retirarmos
vamos ter um sorteio completamente previsvel. Precisamos de um elemento que misture os
elementos. Em Java conseguimos isso usando o mtodo su11l0 em java.util.Coll0.tions. Este
mtodo aceita um List que um tipo especial de coleo onde os elementos podem ser
referidos por um ndice. Eis um exemplo simples. Queremos sortear entre os nmeros 1, 10,
100 e 1000.





01
02
03 public int sorteia ()
04 List lista new ArrayList () ;
05 lista.add ( new Integer ( 1 )) ;
06 lista.add ( new Integer ( 10 )) ;
07 lista.add ( new Integer ( 100 )) ;
08 lista.add ( new Integer ( 1000 )) ;
09
10 Collections.suIIle ( lista ) ;
11
12 // pega qualquer indice. pegamos o primeiro para conveniencia.
13
14 return (( Integer ) lista.get ( 0 )) .intValue () ;
15 }


Cdigo 1:
Repare que a grande diferena aqui que escolhemos os numeros que podem ser sorteados,
um a um.
A classe Random tem um mtodo especial que ajuda nesta gerao em intervalo. O cdigo
ficaria assim
1
2 public int sorteia ()
3
4 Random r new Random () ;
5 final int H 60 ; / sorteia entre 1 e 60
6 final int L 1 ;
7 return r.nextInt ( H 1 ) L
8 }


Cdigo 4:

O mtodo n0tnt de Random gera um inteiro no intervalo [0, H+1[ , ou seja, entre 0 e
Como vemos diferena mnima. Basta utilizar o mtodo r0mov0 em vez do 0t. Contudo a
lista de valores possveis guardada e iniciada fora do mtodo. Para intervalos o processo
mais complexo j que temos que memorizar o elemento sorteado.

01
02
03 Set sorteados new TreeMap () ;
04
05 public int sorteia ()
06
07 Random r new Random () ;
08 final int H 60 ; / sorteia entre 1 e 60
09 final int L 1 ;
10 int result;
11 do ()
12 result r.nextInt ( H 1 ) L
13 while ( !sorteados.add ( new Integer ( result ))) ;
14
15 return result;
16 }


Cdigo 6:

O numero gerado e adicionado a coleo de numeros j sorteados. Se o numero j existia
no conjunto o mtodo add retorna 1als0 e o lao recomea gerando outro numero.O lao s
termina quando um numero novo for gerado. Este processo extremamente ineficiente pois
medida que o numero de elementos no conjunto dos j sorteados cresce cada vez mais
dicifil gerar um numero diferente.
Na prtica o sorteio sem repetio dentro de um intervalo no muito til e quase sempre
possvel utilizar um mecanismo utilizando colees.
Sortear numeros um processo comum, mas muitas vezes precisamos sortear outro tipo de
objeto. Podemos querer sortear $trin ou qualquer outro objeto. Nestes casos podemos
utilizar o sorteio utilizando listas para sortear os objetos. Na realidade, com este mtodo,
sempre estivemos sorteando objetos desde um inicio. Acontecia apenas que esses objetos
representavam numeros.Eis um exemplo de sorteio se $trins

01
02
03 public int sorteia ()
04 List lista new ArrayList () ;
05 lista.add ( 'Alice ) ;
06 lista.add ( 'Bruno ) ;
07 lista.add ( 'Carlos ) ;
08 lista.add ( 'Daniel ) ;
09
10 Collections.suIIle ( lista ) ;
11
12 // pega qualquer indice. pegamos o primeiro para conveniencia.
13
14 return (( Integer ) lista.get ( 0 )) .intValue () ;
15 }


Cdigo 7:

Вам также может понравиться