Ola pessoal. Tenho uma dúvida. Quero fazer um vetor com zeros e uns aleatórios.
Consigo fazer isso perfeitamente, entretanto tenho mais uma restrição que não consigo implementar: meu vetor deve ter um número x de uns e o resto de zeros.
Alguém sabe como fazer isso ? Não achei forma nenhuma de fazer.
Mas isso nao resolve o problema, pois quero limitar o numero de “uns” ou true do meu vetor.
Por exemplo, quero que tenha só cinco uns, e o resto sejam zeros.
Pensei em algo desse tipo:
int flag = random.nextInt(2);
if (flag==1)
contador++;
if(contador >= numeroMaximoDeUns) {
flag = 0;
}
vetor = flag;
mas esse código é viciado, ele tenderá a por os “uns” no inicio do vetor, tirando todo o fator de aleatoriedade que eu queria.
int aux = 0;
int rand = 0;
for ( int i = 0; i < seuArray.length; i++ ) {
rand = ( int ) ( Math.random() * seuArray.length() );
aux = seuArray[ rand ];
seuArray[ rand ] = seuArray[ i ];
seuArray[ i ] = aux;
}
Pronto, agora seu array tem 5 uns e o resto de zeros em posições aleatórias.
É claro que agora vc vai criar e preencher seu array em tempo de execução.
Eu tava pensado em algo muito mais sofisticado do tipo, se quero por 5 trues aleatórios num vetor de 100 posições, calcular 5 números aleatórios de 1 a 100 e nessas posições colocar os trues/uns.
Mas essa tua idéia é muito mais simples, rápida e tão efetiva quanto.
Obrigada : )
A única dúvida que me restou é se esse embaralhamento do array vai ser tornar o código bem aleatório mesmo (será que ele não tenderá a deixar os trues/uns no começo do vetor ?), mas acho que dá certo sim.
[quote=mari_sm]
A única dúvida que me restou é se esse embaralhamento do array vai ser tornar o código bem aleatório mesmo (será que ele não tenderá a deixar os trues/uns no começo do vetor ?), mas acho que dá certo sim.[/quote]
Acho que não… Apesar de ser algo pseudo-aleatório, vc vai conseguir realizar o que precisa.
Enfim, teste
Eu tava pensado em algo muito mais sofisticado do tipo, se quero por 5 trues aleatórios num vetor de 100 posições, calcular 5 números aleatórios de 1 a 100 e nessas posições colocar os trues/uns.
[/quote]
A sua solução é mais eficiente em termos de tempo ( e é igual em termos de espaço) à de fazer um Shuffle. Se seu vetor tiver muitas posições, use um java.util.BitSet.
É algo como:
boolean[] bits = new boolean [100]; // isto inicializa tudo com "false" = 0
int i = 0;
Random r = new Random();
while (i < 5) {
n = r.nextInt (100);
if (!bits [n]) {
bits [n] = true; // setando como "true" = 1
i++;
}
}