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?
Otimização de exercício em java
6 Respostas
Tenta aí:
public int aleatorio ( int limiteInf, int limiteSup )
{
return (limiteInf + Random.nextInt( limiteSup - limiteInf ));
}
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!
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!
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?
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!!!
Certinho é isso mesmo!