Simulação de Dados - Ajuda ae gente

Iae galerinha, professor passou um trabalho pra fazer eu fiz e apresentei ontem, ele achou o trabalho bom e tal, mas ele disse que eu poderia economizar mais linhas de código colocando todos os println dentro de um unico for e baixou minha nota por isso aff… eu tentei aqui e não consegui sempre estoura os vetores.

Explicando o que o programa faz
(PARTE 1) ele joga um dado N vezes e diz quantas vezes deu cada face
(PARTE 2) ele joga 2 dados N vezes e diz quantas vezes deu cada soma possivel.
(PARTE 3) ele joga 3 dados N vezes e diz quantas vezes deu cada soma possivel.

obrigado a todos que puderem ajudar.

import java.util.Scanner;
public class SimulacaoDeDados {
	public static void main (String args[]) {		
		int dados[] = new int[7]; 
		int soma2Dados[] = new int[13]; 
		int soma3Dados[] = new int[19];
		Scanner s = new Scanner(System.in);
		System.out.println("Digite o número de vezes que os dados serão lançados");
		int n = s.nextInt();
		// PARTE 1
		for (int i=0; i<n; i++) {			 
			dados[(int) (1 + Math.random() * 6)]+=1; 
		}
		// PARTE 2
		for (int i=0; i<n; i++) {						
			soma2Dados[(int) (1 + Math.random() * 6) + (int) (1 + Math.random() * 6)]+=1; 			
		}
		// PARTE 3
		for (int i=0; i<n; i++) {
			soma3Dados[(int) (1 + Math.random() * 6) + (int) (1 + Math.random() * 6) + (int) (1 + Math.random() * 6)]+=1; 			
		}
		// IMPRIME PARTE 1
		System.out.println("Lançamento de um dado " + n + " vezes e mostrando quantas vezes deu cada face do dado.");
		for (int i=1; i<dados.length; i++) {
			System.out.println("Face " + i + ": " + dados[i] + "x"); 			
		}
		// IMPRIME PARTE 2		
		System.out.println("Lançamento de dois dados " + n + " vezes e a quantidade de vezes que deu cada soma possível.");
		for (int i=2; i<soma2Dados.length; i++) {
			if (soma2Dados[i] > 0) {
				System.out.println("Soma = " + i + "\t" + soma2Dados[i] + "x"); 
			}			
		}
		// IMPRIME PARTE 3		
		System.out.println("Lançamento de três dados " + n + " vezes e a quantidade de vezes que deu cada soma possível.");						
         	for (int i=3; i<soma3Dados.length; i++) {			
			if (soma3Dados[i] > 0) {				
				System.out.println("Soma = " + i + "\t" + soma3Dados[i] + "x"); 
			}	
		}		
	}
}

o modo que eu tentei e queria fazer imprimir os dados em um unico for foi ± assim, mais ae n imprimiria os blocos tipo PARTE 1, PARTE 2 e PARTE 3 imprimiria uma linha de cada por vez e não ficaria legal isso -.- eu to começando a achar q o professor não vai com minha cara :evil:

							
		for (int i=0; i<soma3Dados.length; i++) {			
                        System.out.println("Face " + i + ": " + dados[i] + "x"); 

			if (soma2Dados[i] > 0) {
				System.out.println("Soma = " + i + "\t" + soma2Dados[i] + "x"); 
			}			                        
			if (soma3Dados[i] > 0) {				
				System.out.println("Soma = " + i + "\t" + soma3Dados[i] + "x"); 
			}	
		}		

Eu ia baixar a nota mais ainda pela bagunça que tá o código :lol:
Use funções/métodos/procedimentos/subprogramas se quiser um código que valha mais.

Não entendi esses dois últimos. Como assim quantas vezes deu cada soma possível se só vai dar uma soma?

haeiuheai tipo se uma das bagunças que você se refere é colocar o Math.random direto no indice do array eu também achei ruim, antes eu tinha atribuido variaveis do tipo dado1, dado2 e dado3, mas o professor disso pra eu fazer do jeito que está que o codigo fica mais enxuto o.O
Eu não sei de muita coisa não to começando a ver java agora na faculdade…

[quote=Bruno Laturner]
Não entendi esses dois últimos. Como assim quantas vezes deu cada soma possível se só vai dar uma soma?[/quote]

eu me expressei errado, ja corrigi no post principal, esse codigo todo eu arrumei depois que ele reclamou do meu trabalho :evil:

mas quando eu me referi ali cada soma possivel é lançar 2 dados e somar os dois e dizer quantas vezes deu cada soma e a mesma coisa para 3 dados :wink:

um pedacinho do codigo original antes do professor da os ataques dele. :smiley:

for (int i=0; i<n; i++) {			
				dado1 = (int) (1 + Math.random() * 6); // Gera um número aleatório de 1 a 6
				dado2 = (int) (1 + Math.random() * 6); // Gera um número aleatório de 1 a 6
				dado3 = (int) (1 + Math.random() * 6); // Gera um número aleatório de 1 a 6
				soma = dado1+dado2+dado3; // Faz a soma dos dados lançados			
				soma3Dados[soma]+=1; // Incrementa a quantidade de vezes que deu cada soma no vetor			
			}			
			for (int i=3; i<soma3Dados.length; i++) {			
				if (soma3Dados[i] > 0) {				
					System.out.println("Soma = " + i + "\t" + soma3Dados[i] + "x"); // Imprime a quantidade que deu cada soma possível
				}			
			}

Já aprenderam como usar arrays dinâmicos ou coleções? Com elas daria pra fazer uma lista de somas de N dados e M jogadas.

Ainda não aprendemos isso :cry: estamos iniciando OO, mas olha você me deu tanta força que eu poderia criar metodos e funções que eu acabei dando uma lida aqui e acho que melhorei um pouquinho o meu código e o jeito de pensar, deve ta um pouco bagunçado ainda eu acho que passei muitos parametros nos metodos, mas foi um jeito que eu arrumei, com o tempo eu vou melhorando… iae mereço um 9 pelo omenos? 8)

public class SimulacaoDeDados {
	public static void main (String args[]) {
		int dados[] = new int[7];
		int soma2Dados[] = new int[13];
		int soma3Dados[] = new int[19];
		java.util.Scanner s = new java.util.Scanner(System.in);				
		try {
			System.out.println("Digite o número de vezes que os dados serão lançados.");
			int n = s.nextInt();						
			iniciando(n, 1, dados);			
			iniciando(n, 2, soma2Dados);
			iniciando(n, 3, soma3Dados);
			System.out.println("Lançamento de um dado " + n + " vezes e mostrando quantas vezes deu cada face do dado.");
			imprimir(1, dados.length, dados, "Face = ");				
			System.out.println("Lançamento de dois dados " + n + " vezes e a quantidade de vezes que deu cada soma possível.");
			imprimir(2, soma2Dados.length, soma2Dados, "Soma = ");			
			System.out.println("Lançamento de três dados " + n + " vezes e a quantidade de vezes que deu cada soma possível.");
			imprimir(3, soma3Dados.length, soma3Dados, "Soma = ");			
		} catch (java.util.InputMismatchException ime) {
			System.err.println("Você não digitou um número válido.");
		}		
	}		
	public static void iniciando(int n, int x, int dado[]) {
		for (int i=0; i<n; i++) {			
			dado[somar(x)]+=1; 			
		}
	}	
	public static void imprimir(int x, int tamanho, int dado[], String tipo) {		
		for (int i=x; i<tamanho; i++) {			
			if (dado[i] > 0) {
				System.out.println(tipo + i + "\t" + dado[i] + "x");
			}
		}
	}
	public static int somar(int x) {
		int soma = 0;
		for (int i = 0; i < x; i++) {
			soma += (int) (1 + Math.random() * 6);
		} return soma;		
	}
}

Só uma perguntinha, por que as variaveis e métodos de classe tem que ser estaticos para ficarem acessiveis pelo main e outros métodos? :wink:

http://www.guj.com.br/java.tutorial.artigo.121.1.guj

não precisa criar atributos static e metodos static para ser testado no main. seria muito bom vc testa o metodo main em outra classe, o metodo main não retorna nada ele e estatico não modifica e recebe uma Array de String. se voce criar uma variavel sem ser static e testar no main não vai dar serto o main e estatico.

Tira uma duvida por que vc usa o primitivo int entre chaves? Ex: soma += (int) (1 + Math.random() * 6);

Por que vc não cria um metodo para manipular a class Math Ex: void setnomeMetodo(double x){
x=Math.random()*6;
}

Por que vc não cria um metodo para manipular a class Math Ex: double getnomeMetodo(){
x=Math.random()*6;
return x
}
descupa é assim

[quote=jolivier] não precisa criar atributos static e metodos static para ser testado no main. seria muito bom vc testa o metodo main em outra classe, o metodo main não retorna nada ele e estatico não modifica e recebe uma Array de String. se voce criar uma variavel sem ser static e testar no main não vai dar serto o main e estatico.
[/quote]

É eu vi isso depois de da uma lida no tutorial que o thgdias colocou ai sobre static deu uma clariada nas ideias, arrumei o código dinovo, acho que ficou bomzinho agora…

[quote=jolivier]Tira uma duvida por que vc usa o primitivo int entre chaves? Ex: soma += (int) (1 + Math.random() * 6);
[/quote]

Se eu não estou enganado o Math.random ele retorna um double entre 0 e 1 esse (int) é um casting para para colocar o double dentro do int