Como posso fazer esse método, colocando números negativos no array?
A classe indicada é a Random, entretanto, como o método que gera números inteiros, está limitado ao conjunto dos números naturais, você pode usar o Random para gerar um boolean aleatório.
Assim, ao combinar os dois, você tem a sua necessidade atendida.
Vide exemplo:
public static void main(String[] args) {
int[] vetor = new int[50];
Random r = new Random();
for (int i = 0; i < vetor.length; i++) {
vetor[i] = r.nextBoolean() ? -r.nextInt(51): r.nextInt(101);
}
System.out.println("Desordenado:\n"+Arrays.toString(vetor));
Arrays.sort(vetor);
System.out.println("Ordenado facilita visualização do range: \n"+Arrays.toString(vetor));
}
vetor[i] = r.nextInt(50) * (r.nextBoolean() ? 1 : -1); não entendi essa linha do código
vetor[i]: percorrendo cada index do vetor;
r.nextInt(50), gera um inteiro positivo aleatório até 49: alterei o range para 51, cobrindo o 50;
r.nextBoolean(), gera um boolean aleatório para ser usado como teste de um o operador ternário ( ? : )
Quando o boolean aleatório é true, multiplica o inteiro gerado por 1.
Quando o boolean aleatório é false, multiplica o inteiro gerado por -1.
Como ví uma inconsistência no range, gerei outra codificação para atender ao proposto.
public static void main(String[] args) {
int[] vetor = new int[50];
Random r = new Random();
for (int i = 0; i < vetor.length; i++) {
int val = (r.nextBoolean() ? 1 : -1);
vetor[i] = r.nextInt(val == -1? 51 : 101)* val;
}
System.out.println("Desordenado:\n"+Arrays.toString(vetor));
Arrays.sort(vetor);
System.out.println("Ordenado facilita visualização do range: \n"+Arrays.toString(vetor));
}
Definindo o intervalo em um ArrayList, entretanto, teria que reservar memória para o array.
public static void main(String[] args) {
//gerando o range solicitado
ArrayList<Integer> range = new ArrayList<>(IntStream.rangeClosed(-50, 100).boxed().collect(Collectors.toList()));
Random r = new Random();
int[] vetor = new int[50];
for (int i = 0; i < vetor.length; i++) {
vetor[i] = range.get(r.nextInt(range.size()));//pesquisa aleatória dentro do ArrayList range
}
System.out.println(Arrays.toString(vetor));
}
Só tem como fazer com arraylist ?
Se você puder criar um array novo:
int quantidade = 10;
int minimo = -50;
int maximo = 100;
int[] numeros = new Random().ints(minimo, maximo).limit(quantidade).toArray();
Se tiver que preencher um array já existente:
public static void main(String[] args) {
int quantidade = 10;
int[] numeros = new int[quantidade];
preencher(numeros, -50, 100);
}
public static void preencher(int[] dst, int min, int max) {
Random r = new Random();
for (int i = 0; i < dst.length; i++)
dst[i] = min + r.nextInt(max - min);
}
esse encadeamento de métodos já vai criar um array de dez indices com números aleatórios de -50 a 100? Se é isso, eu achei que esse encadeamento de métodos que vc fez é muitooo legal 
E quanto a esse encademanto de métodos abaixo:
ArrayList<Integer> range = new ArrayList<>(IntStream.rangeClosed(-50, 100).boxed().collect(Collectors.toList()));
Isso cria um ArrayList<Integer> contendo o que? Esse ArrayList terá uma quantidade de índices limitada e fixa? E o que é:
- A classe
IntStream? - O método
rangeClosed()? - O método
boxed()? - O método
collect()? - A classe
Collectors? - O método
toList()?
Parece ser outro encadeamento de métodos bem legal 
Onde você aprendeu esses encadeamentos e essas classes e métodos? Na documentação mesmo ou em livros?
Só não gostei no seu código da var “int[] dst”, o que é dst? Pra mim esse nome de variável é muito obscuro 
Sim, é a “nova” (já não tão nova) API de streams do Java 8.
IntStream é uma stream de int, inteiros primitivos. rangeClosed é um método estático dessa classe que retorna uma stream de inteiros primitivos partindo do primeiro argumento até o segundo (inclusivo, por isso o closed). boxed é um método dessa classe que retorna uma stream de Integer, o objeto que representa inteiros. collect é um método que converte a stream para algum objeto do seu interesse. Nesse caso, ele é convertido para uma List, porque o Collectors.toList() é utilizado. Você pode criar seu próprio collector e transformar a stream no que você quiser.
É um nome bem comum que se dá à parâmetros de funções desse tipo.
-
src= source, fonte, origem -
dst(oudest) = destination, destino, alvo