fjucks,
em primeiro lugar, repare que você está passando uma variável pistao para o método add e essa variável está vindo na assinatura do construtor. Você está inserindo várias vezes o mesmo objeto. Acredito que você queira, na verdade, dar um add da variável local pista.
Outro ponto é que não está mostrado no trecho de código que você colocou, como a variável pist é instanciada e nem como você está verificando quantos elementos existem dentro dela. Coloca o resto do código pra gente verificar.
E, por último, não é uma boa prática construir o for do jeito que você fez. Perceba que a condição de parada muda a cada instante e isso não é bom por diversos motivos (desde legibilidade, performance do otimizador, características determinísticas e outras).
O melhor é você instanciar uma variável antes do for com um valor de parada e depois comparar lá dentro. Algo como
int j = (int)(4 + Math.random() * 3);
for (int i=0; i<j; i++) {etc}
Mas, uma sugestão melhor em termos de design e testabilidade de código é: ao invés de fazer como eu coloquei acima, receber no construtor a quantidade de pistões que você quer criar e deixar para quem chama o construtor a responsabilidade de decidir quantos ele quer. Dessa forma, você pode até colocar os seus valores aleatórios como você quer, como também colocar um valor fixo pra testar se está funcionando corretamente.