Algoritmo para preencher vetor com números randômicos e diferentes
[ads2]
Olá a todos, hoje vamos aprender como fazer um algoritmo que preencha um vetor ou lista com números randômicos e diferentes. Você pode usar este algoritmo de diversas maneiras, em programas ou jogos. Por exemplo, suponhamos que eu esteja desenvolvendo um jogo de corrida de carros, e tenha que a cada nova corrida, colocar os carros no grid de forma aleatória, considerando que sejam 9 carros.
Neste caso podemos usar um vetor de 9 posições, o qual iremos preencher com números de 1 a 9, que representam os carros, para isso precisamos gerar os números randomicamente.
Veja a baixo um exemplo feito na linguagem JavaScript
Em JavaScript
var num = new Array(9); //criando vetor com 9 posições
for(var i=0;i<9;i++){ //laço para percorrer todo o vetor
var randomico = Math.floor(Math.random()*9)+1; //gerando número aleatório
var existe=false; //para saber se o numero existe ou não no vetor
for(var cont=0;cont
Veja que o que é feito é um laço de repetição para percorrer o vetor, e que o valor gerado aleatoriamente é testado para ver se ele já existe no vetor por meio de mais um laço de repetição que percorre o vetor até a ultima posição testada. Se o número já existe o algoritmo salva o valor true na variável existe (da qual falo abaixo) e sai do segundo laço com o comando break, se não ele atribui false a variável existe.
A variável existe é do tipo boolean, e é fundamental para o funcionamento do algoritmo, pois ela serve para determinar se o número já existe ou não, veja que inicialmente ela assume o valor false, mas que pode ser alterada de acordo com a existência do número procurado. No final os testes são feitos com ela e se for igual a false ela guarda o número gerado no vetor, se for verdadeiro é decrementado a variável de controle do laço para que ele execute novamente na mesma posição.
Exemplo em Java
public class Main {
public static void main(String[] args){
int num[]=new int[9];//Criando vetor
for(int i=0;i
Caso vocês tenham sugestões para melhorar o algoritmo deixem nos comentários. Até a próxima!
[ads1]
Isso é coisa de criança, de quem está em primeiro semestre em faculdade…
de todo caso, em java:
…
final int QUANT = 9;
List x = new ArrayList();
for(int i = 1; i <= QUANT; i++) x.add(i);
Collections.shuffle(x);
int[] x1 = new int[x.size()];
for(int i = 0; i < x.size(); i++) x1[i] = x.get(i);
…
Error de compilação ao atribuir tipo de objeto diferente, a necessidade de fazer o cast , ou atribuir o tipo da lista para Integer, sugestão:
(int) x.get(i);
List x = new ArrayList();
Sejas menos presunçoso, vc não nasceu sabendo.
Humildade faz bem ao espirito.
Ou então as linhas
int[] x1 = new int[x.size()];
for(int i = 0; i < x.size(); i++) x1[i] = x.get(i);
poderiam virar
Integer[] x1 = (Integer[])x.toArray();
Valeu pela dica José Alves.
JavaScript
arrasta=[]; // Fazemos um array para o sorteio
contagem; // contagem de length para verificação
function simples() // função principal que deve ser chamada
{
var max=12; // variáveis referenciais para o math.random e função embaralhar()
var min=1; // idem
for(i=0; i<=5 ; i ++) //laço de repetição que marca as posições no array
arrasta.push(embaralha(min,max) ); //os resultados embutidos no vetor arrasta vindo da função embaralha.
arrasta2= new Set(arrasta); // caso haja sorteios de valores iguais no vetor, esse parâmetro retira.
arrasta3=[…arrasta2]; // criamos uma um array novo para recebermos os novos valores do parametro acima sem resultados duplicados.
contagem=arrasta3.length // a variável universal "contagem" recebe a quantidade de elementos dentro da array "arrasta3"
// Mas como recebemos a quantidade certa do laço for no array? Legal , o parâmetro "Set" vai retirar as repetidas ,mas não vai adicionar novas não repetidas.
Mas temos o pulo do gato aqui no laço "While".
while((contagem 5)) //
{
simples();
}
alert(arrasta3);
}
// Como temos que receber exatamente 5 posições com valores diferentes , o laço nunca vai terminar se não recebermos os 5 valores diferentes. Ou seja , só vai sair do laço se forem 5 valores diferentes como assim desejamos.
function embaralha( min , max )
{
var calculo=Math.floor(Math.random()*(max-min))+min;
return calculo;
}
// Função que temos como resultado os parâmetros para a função principal que irá retornar os resultados aleatórios exigidos para um vetor sorteados com números aleatórios.
Já coloquei aqui um método antes para fazer a mesma coisa em JavaScript.
Mas como tudo na vida deve ser simplificado,aqui vai um código fresco e com muito menos linhas :
vetor[]; // vetor vazio para o sorteio randômico.
//Faremos um laço For para definirmos quantas posições queremos dentro do vetor.
for(i=0;i<=9;i++); // no caso , aqui, quero que ele tenha 10 posições.
{
var sorteio =Math.floor(Math.random()*(20-1))+2; // Serão sorteados números de 1 a 20.
vetor.push(sorteio); // Aqui , colocamos os números dos 10 sorteios diferentes dentro de cada uma das 10 posições dentro do vetor.
}
// Agora, sabemos que temos 10 números aleatórios dentro do nosso vetor . Mas e se eles forem repetidos ? Temos como ajustar para que eles sejam sempre diferentes uns dos outros?
Claro que sim!
Criaremos uma variável para que faça esse filtro para nós:
var vetor2= new Set(vetor);
// Criamos agora um vetor para receber os números diferentes uns dos outros após o filtro.
var vetor3[…vetor2];
//Pronto! Agora para que possamos ver o resultado na tela , jogamos um "document.write com o resultado:
document.write (vetor3);
Legal! Agora temos os nossos números aleatórios dentro de um array de forma bem simples! Claro que , caso queiramos um número determinado de posições , podemos jogar um slice para apagar a "sobra".
No nosso caso , se quisermos mostrar apenas 5 posições (5 números sorteados)
,faremos da seguinte maneira:
var definicao=vetor3.slice(-5);
document.write(definicao);
Espero ter ajudado e mostrado mais uma forma de se fazer a mesma coisa!
Segue o código na íntegra e sem comentários(limpo):
var teste =[];
for(i=0;i<=9;i++)
{
var sorte= Math.floor(Math.random() *(20-1))+2;
teste.push(sorte);
}
var teste2=new Set(teste);
var teste3=[…teste2];
var definicao=teste3.slice(-5);
document.write(definicao);