Jogar dois dados e imprimir soma quantidade de vezes de cada soma

Olá,

Estou com o seguinte problema:
Exercício. Construir um programa que simula o lançamento de dois
dados. O programa deve usar um objeto da classe Random para
lançar os dados. Como cada dado pode mostrar um valor de 1 a 6, a
soma dos dois dados varia de 2 a 12. O programa deve lançar os
dados 30000 vezes. Utilizar um vetor para guardar o número de
vezes que cada possível valor da soma ocorreu. Mostrar o valor da
soma mais frequente e o valor da soma menos frequente.
? Qual deverá ser a soma mais frequente?
? Qual deverá ser a soma menos frequente?

Tentativa de Solução:
import java.util.Random;
import javax.swing.JOptionPane;

public class Dados {

private int nj;

public int[] jogadas(){
	String s;
	s = JOptionPane.showInputDialog("Quantas jogadas?");
	nj = Integer.parseInt(s);
	int soma[] = {2,3,4,5,6,7,8,9,10,11,12};
	int B[] = new int[soma.length];
	Random r = new Random();
	int sum = 0;

	for (int i = 0; i < nj; i++) {
		int a = r.nextInt(5)+ 1;
		int b = r.nextInt(5)+ 1;
		sum = a + b;
		for (int j = 0; j < soma.length; j++) {
			if(sum == soma[j]){
				B[j] += 1;
			}
		}
	}
	return B;
}

}

public class TesteDados {

public static void main(String[] args) {
	Dados d = new Dados();
	int[] r = d.jogadas();
	System.out.println(r[0]+"  "+r[1]+"  "+r[2]+"  "+r[3]+"  "+r[4]+"  "+r[5]+"  "+r[6]+"  "+r[7]+"  "+r[8]+"  "+r[9]+"  "+r[10]);
}

}

Alguém saberia me explicar porque não funciona?

Você pode criar um vetor de inteiros, com 13 posições. Use a posição [2] para totalizar as vezes em que a jogada obteve o valor 2, [3] para o valor 3, e assim por diante, até o [12] que recebe o valor 12. As posições [0] e [1] podem ficar desocupadas. Eu prefiro desperdiçar 8 bytes (2 inteiros) nesse caso, em vez de ficar ajustando em montes de lugares o array, o que é bastante confuso.

Um exemplo para o caso em que quero fazer 1000000 simulações:

int[] soma = new int[13];
for (int i = 0; i < soma.length; ++i) 
    soma[i] = 0; // não é preciso zerar, mas fazendo assim fica mais fácil para você entender
for (int i = 0; i < 1000000; ++i) { // é óbvio que seu problema não pediu 1000000 , mas você tem de mexer no meu exemplo, certo?
     int a = r.nextInt (6) + 1; // note que nextInt volta um valor de 0 até n - 1, ou seja, de 0 até 5. Então eu somo 1 para ficar de 1 até 6.
     int b = r.nextInt (6) + 1;
     int s = a + b;
     soma [s] = soma [s] + 1;
}

Para a “soma mais frequente” e a “soma menos frequente”, obviamente você tem de achar o valor máximo e o valor mínimo nas posições de [2] a [12]. Acho que você é esperto suficiente para achar o valor máximo e o mínimo.

Funcionou certinho e bem mais simples do que o que eu estava tentando.
Obrigado.