sorteios aleatórios em java

Upload: gerson-mayer

Post on 18-Jul-2015

361 views

Category:

Documents


0 download

TRANSCRIPT

Sorteios aleatrios em JavaPropostaConstruir um algoritmo que selecione aleatoriamente numeros mas de forma que no haja repetio dos numeros selecionados.

Processos de seleo aleatriaExistem dois processos bsicos de seleo de nmeros: sorteio e sequencia aleatria. Estes processo so semelhantes mas so dois processos diferentes. A seguir exploraremos cada um deles e exemplicaremos implementaes em Java.

Sequencia AleatriaO conceito da sequencia aleatria limita-se a obter um numero aps o outro, tal que o numero seguinte imprevisivel dada a sequencia de nmeros j escolhidos antes. A sequencia aleatria o processo implementado comummente 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 ele de fato um gerador de sequncias aleatrias. A gerao de sequencias aleatrias com Random no to aleatoria assim.A gerao baseia-se num algoritmo que parte de um numero e gera outro, e a partir desse outro , assim sucessivamente. Esse primeiro numero chamado de semente (seed, em ingls). Diz-se que este tipo de sequncia pseudoaleatria porque tentar prever essa gerao "fora bruta demasiado complexo para ser feito na prtica mas no impossivel em teoria. 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 SecureRandom que implementa algoritmos mais dificeis de prever. Uma utilidade muito importante das sequncias pseudo-aleatrias a capacidade de repetir a mesma sequncia caso seja necessrio. Random suporta o conceito de semente. Portanto, criando o objeto com a mesma semente ser produzida a mesma sequncia. Isto de extrema importancia em algoritmos como os Testes de Monte Carlo onde queremos produzir nmeros aleatriamente, mas queremos produzir sempre os mesmos a cada execuo do teste para obter repetibilidade. Objetos da classe Random geram sequncias de quase todos os tipos primitivos em java nomeadamente: boolean, int, long, float e double. O contra-dominio ( ou seja, o conjunto de nmeros possiveis de serem gerados) das sequncias aleatrias limitado entre 0.0 (zero) e 1.0 (um) para double e float. Para os outros tipos o contra-dominio so todos os valores possiveis para esse tipo de varivel em Java. A gerao feita tal que todos os valores possiveis tm igual probabilidade.

SorteioO conceito de sorteio o de um processo em que um dos possiveis valores escolhido de entre todos os outros. O sorteio pode ser com repetio ou sem repetio. Imagine que tem um 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 possivel de ser sorteado. O sorteio o processo em que uma pessoa coloca a mo na sacola e retira um 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 j que as bolas no voltam para a tombola.

A diferena de um processo de sequncia aleatria para um de sorteio que em um sorteio ns escolhemos o conjunto de nmeros possiveis ao invs de utilizar todo o intervalo de um certo tipo de valor.

Sorteio de um elemento em um conjuntoSimular 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 previsivel. Precisamos de um elemento que misture os elementos. Em Java conseguimos isso usando o mtodo suffle() em java.util.Collections. Este mtodo aceita um List que um tipo especial de coleo onde os elementos podem ser referidos por um indice. Eis um exemplo simples. Queremos sortear entre os nmeros 1, 10 , 100 e 1000. 01.public int sorteia (){ 02. List lista = new ArrayList () ; 03. 04. lista.add ( new Integer ( 1 )) ; 05. lista.add ( new Integer ( 10 )) ; 06. lista.add ( new Integer ( 100 )) ; 07. lista.add ( new Integer ( 1000 )) ; 08. 09. Collections.suffle ( lista ) ; 10. 11. // pega qualquer indice. pegamos o primeiro para conveniencia. 12. 13. return (( Integer ) lista.get ( 0 )) .intValue () ; 14.} 15. Cdigo 1: Sortear entre os nmeros 1, 10 , 100 e 1000 Repare que a grande diferena aqui que escolhemos os nmeros que podem ser sorteados, um a um. Utilizando este processo podemos simular uma loteria com quaisquer nmeros. Se os nmeros forem muitos utilizaremos um lao para iniciar a lista de opes, mas o processo de sorteio, em si, o mesmo. 01.public int sorteia (){ 02. List lista = new ArrayList () ; 03. 04. for ( int i = 1 ; i