Problema com randoms

4 respostas
gatyuri

É o seguinte, preciso resolver um problema que para os bons entendedores de lógicas é melzinho na chupeta…

A partir de um valor inteiro tenho que dividi-lo em 5 novos inteiros com valores aleatórios, mas que as soma dos 5 seja igual ao valor do primeiro…

Por exemplo, tenho um valor ‘1000’, e depois de dividido em 5 novos valores ficariam: 220 184 321 68 207.

Os 5 valores na maioria das vezes precisam ser mais ou menos aproximados um dos outros, mas em certos momentos seria bom também que um desses valores seja bastante baixo ou bastante alto…

Alguém se habilita? :smiley:

4 Respostas

romarcio

Não poderia dividi-los em 4 partes e depois calcular a diferença entre a soma das 4 partes com o valor total? Pegue a diferença e use como 5° valor.

1000 - ( 220 + 184 + 321 + 68 ) = 207

Ultima valor seria então = 207

É mais prático do que ficar gerando aleatoriamente os 5 valores e ficar somando eles até que feche a soma inicial.

gusthavosouza

Pq nao usa o Math.random? da uma olhada na APi ,
Pega ele faz um if que ele só pode ter o valor maximo de 1000, e faz um metodo que divida e use o mathrandom, pra te dar o resultado , sabendo que a soma dos 4 ou 5 numeros que vc queer serem 1000 ou menos
, achu qeu seria mais ou menos assim .
abçs vo da uma olhada aki e ver no que tento ajuda, probleminha bem bacana pra mim que to iniciando em java uma otima forma de desenvolver a logica
abçs
http://www.guj.com.br/java/98-mathrandom da uma olhada nisso

posso ta fazendo merda mas e assim que se aprende tentando e tentando , nada na vida esta pronto , basta qerer aprender com tal coisa.

ViniGodoy
Eu usaria a ideia do Romarcio:
public class Teste {
	public static final Random RAND = new Random();

	public static int[] gerar(int soma, int count)
	{
		int[] numeros = new int[count];
		int ultimo = soma;
		for (int i = 0; i < count-1; i++)
		{
			numeros[i] = RAND.nextInt(ultimo+1);
			ultimo -= numeros[i];
		}
		numeros[numeros.length-1] = ultimo;		
		return numeros;
	}
	public static void main(String[] args) throws IOException {
		for (int numero : gerar(1000,5))
			System.out.println(numero);
	}
}
Outra possibilidade, caso você queira evitar que apareçam zeros seguidos:
public class Teste {
	public static final Random RAND = new Random();

	public static int[] gerar(int soma, int count)
	{
		int[] numeros = new int[count];
		int parte = soma / count;
		int ultimo = soma;
		for (int i = 0; i < count-1; i++)
		{
			int sorteio = RAND.nextInt(parte+1);
			numeros[i] = parte - sorteio;
			ultimo -= numeros[i];
		}
		numeros[numeros.length-1] = ultimo;		
		return numeros;
	}
	public static void main(String[] args) throws IOException {
		for (int numero : gerar(1000,5))
			System.out.println(numero);
	}
}
gatyuri

Obrigado a todos que me ajudaram, implementei o código que o ViniGodoy postou aqui, baseado na ideia do romarcio, e supriu o que estava sendo preciso no meu projeto.

Criado 20 de outubro de 2012
Ultima resposta 20 de out. de 2012
Respostas 4
Participantes 4