Números randomicos com contador

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.

Você pode usar a classe Random para gerar números aleatórios e preencher com 1 o número gerado for impar e se for par você preenche com zero.

Random random = new Random() random.nextInt();

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.

Preencha o seu array de forma sequencial:

Vamos supor, 5 uns e o resto de zeros

1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

Agora você embaralha o seu array.

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.

Até mais!

Seguindo a mesma linha proposta acima vc pode usar um ArrayList no lugar do Array

Com isso pode usar o método shuffle da classe Collections.

Menos código, mesmos resultados.

VELO

Ótima idéia.

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 :smiley:

Até mais!

Vou ler a documentação desses métodos.
Até !

[quote=mari_sm]Ótima idéia.

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++;
    }
}