Otimização de exercício em java

6 respostas
J

Bom dia amigos!
Faço o curso de tecnologia em Informática em Guaratinguetá - SP, e nos foi passado um exercício que funciona da seguinte maneira: o usuário deve determinar um número, e o computador tem que adivinhar esse número atribuindo valores aleatórios (Random); quando um valor for maior que o número, esse valor deve ser o novo limite a ser considerado, assim como o menor valor. Como considerar é diferente de realizar, o computador consegue detectar o valor, mas realiza n chutes até chegar ao desejado. O que ocorre aí é um desperdício de processamento, porque o computador, apesar dos limites, continua chutando valores acima e abaixo desses limites, apenas considerando os valores dentro do intervalo. O meu questionamento ao professor foi o seguinte: se existia a possibilidade de fazer com que o algoritmo fosse otimizado para somente chutar valores dentro do intervalo, até se chegar ao valor desejado. Isso economizaria em processamento e agilizaria a resposta do algoritmo. Falei com dois professores mestres em programação e um deles não soube me responder e o outro disse que não existe uma classe nem um método capaz de realizar tal tarefa. Alguém poderia me ajudar?

6 Respostas

A

Tenta aí:

public int aleatorio ( int limiteInf, int limiteSup )
{
    return (limiteInf + Random.nextInt( limiteSup - limiteInf ));
}
WendersonLP

Olha eu entendi foi o seguinte, você quer que o usuário digite um valor e o computador, gerando números aleatório, iguale esse valor, sendo que e porposto um limite para que de acordo com o primeiro número gerando pelo computador for maior que o número digitado pelo o usuário faça com que esse número seja o limite maior, mesma situação para caso o número seja menor.

Pois bem, fiz um programinha para ver se eu conseguiria vazer esse algorítmo, e acho que consegui.

O algorítmo é o seguinte.
Digamo que você quer gerar um determinado número que tem um intervalo de 20-30, a solução é você gerar um número de 10-20 e somar esse número gerado com o limite menor do intervalo, ou seja o número 20.
ex: Número gerando foi 5, 5 mais o número menor do limite é igual a 25.

Código: Intervalo de 0-1000

public static void main(String[] args) {

         Random rand = new Random();
         int smaller = 0, smaller = 1000, half = 0, aleatory = 0;
         int number = Integer.parseInt(JOptionPane.showInputDialog("Type the number: "));

         do {
              half = greater - smaller;
              aleatory = rand.nextInt(half) + smaller;

              System.out.print(aleatory + "   ");

              if (aleatory > number)
                 greater = aleatory;
              else
                    smaller = aleatory;

         } while (aleatory != number);
}

Acho que seja isso!
Até mais!

J

Obrigado amigos!!!

Funcionou perfeitamente, só que eu queria entender a lógica… o porquê de subtrair o menor valor da randomização… só não consegui entender isso! No mais, muito obrigado pela ajuda!

WendersonLP

Porque, como eu já tinha falado, se você randomizar o intervalor, de dois determinados números, e soma-lo com o menor intervalo, você só encontrará um número no que intervalo que deseja.

ex: 10-20
se você randomizar de 10 e somar com o intervalo mínimo você só encontrará número entre 10 e 20;
número sorteado 5 + (o valor mínimo do intervalo) 10 = 15.

Entendeu?

J

Acho que entendi mais ou menos… até agora só havia utilizado a função Math.random, que randomiza valores entre 0 e 1… daí eu multiplicava por 100 para chegar a um valor entre 0 e 100… e fazia um cast explícito para transformar esse valor em inteiro… nunca trabalhei com a classe random, então fiquei meio sem saber o que exatamente a classe faz… tipo, eu achei um valor mediano, e coloquei esse valor na randomização… isso quer dizer que vai ser atribuído um valor de 0 até o valor mediano, correto? daí ele vai somar a esse valor o menor valor… então o valor aleatório atribuído nunca vai ser maior que o maior valor do intervalo…

Pelo acho que é isso! Muito obrigado mais uma vez!!!

WendersonLP

Certinho é isso mesmo!

Criado 7 de novembro de 2009
Ultima resposta 9 de nov. de 2009
Respostas 6
Participantes 3