Usar o contains do list é uma péssima idéia. A performance dele é simplesmente desprezível.
Quando o assunto é não ter repetição, você deve utilizar um set. O set naturalmente abandona a repetição.
Além disso, para gerar números aleatórios, use a classe Random. Do jeito que você fez, as chances de se sortear o número 25 são muito menores do que a de qualquer outro número da série. Não é muito justo, concorda?
Olha aqui uma possível solução para o seu problema:
//Criamos um random e um set
Random random = new Random();
Set<Integer> numeros = new TreeSet<Integer>();
//Fazemos o sorteio dos 15 números.
while (numeros.size() < 15) {
numeros.add(random.nextInt(25)+1);
}
//Imprimimos o resultado.
for (Integer numero : numeros) {
System.out.println(numero);
}
Outra forma é fazer como a sena faz. Aí sim, usando um List. Você pode colocar os 25 números na lista e sortear os índices. O que for sorteado, você copia para o vetor de números.
Veja:
//Preenchemos o list com os números
List<Integer> numeros = new List<Integer>();
for (int i = 1; i <= 25; i++)
numeros.add(i);
//Sorteamos 15 índices
int[] numeros = new int[15];
Random random = new Random();
for (int i = 0; i < 15; i++) {
int indice = random.nextInt(list.size());
numeros[i] = list.get(i); //Pegamos o número do índice sorteado
list.remove(i); //Removemos o índice sorteado.
}
//Imprimimos o resultado
for (int numero : numeros) {
System.out.println(numero);
}