Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ricardo Oliveira de Lima

Preencher um vetor com números aleatórios não repetidos

Recommended Posts

Olá a todos,

 

Estou tentando desenvolver um programa para o jogo dos quinze e de início preciso inicializar um vetor(ou matriz) com 16 elementos e preenche-lo com números aleatórios entre 1 e 16. Da primeira maneira que tentei fazer, os números se repetiam ai pensei em criar uma função recursiva que testa-se se o número gerado aleatoriamente se repetia no vetor e em caso positivo, a função chamava a si própria até que o número aleatório gerado fosse diferente dos elementos já preenchidos do vetor.

 

Porém, minha lógica não deu certo e ele gera um erro de segmentation fault. Se alguém puder fazer algum apontamento sobre onde minha lógica falha ou mesmo dar uma outra sugestão desde já agradeço. Segue abaixo o código:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TAM 16


int *inicializa(int *v){

    int i,j;

    for(i = 0;i< TAM; i++){


            v[i] = 0;


    }
    for(i = 0;i< TAM; i++){



          v[i] = preencheVetor(v,i);




    }
}
int preencheVetor(int *v,int l){

    int r,i,j=0;

    srand((unsigned int)time((time_t *)NULL));

    r = 1 + (int) (TAM * ((float)rand()/(float)INT_MAX));



    for(i = 0 ; i <= l; i++){

        if(v[i] == r){
            j++;

        }

    }
    if(j == 0)
       return r;
    else
       return preencheVetor(v,l);
}



int main()
{
    int vetor[TAM], i;

    inicializa(vetor);

    for(i =0 ; i < TAM ; i++){

            if(i == 4 || i == 8 || i == 12)
                printf("\n");


        printf("%d ",vetor[i]);

    }


}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode fazer da seguinte maneira, primeiro uma função que checa se o valor já existe na array:

int existe(int *v, int n)
{
	int i;
	for(i = 0; i < TAM; ++i) {
		if(v[i] == n) {
			return 1;
		}
	}
	return 0;
}
Depois a função que retorna o próximo valor de acordo com os que já existem:

int proximoValor(int *v)
{
	int r;
	srand((unsigned int)time((time_t *)NULL));
	do {
		r = rand() % (TAM+1);
	} while(existe(v, r)); // se o número já existe, randomiza de novo

	return r;
}
Então quando você estiver preenchendo a array só usar:

v[i] = proximoValor(v);

Compartilhar este post


Link para o post
Compartilhar em outros sites

@@Ricardo Oliveira de Lima

 

Algum tempo atrás eu desenvolvi um programa para o "jogo dos quinze" e tive o mesmo problema que você...

 

Resolvi da seguinte forma:

 

-> Toda vez que gerar um novo número no vetor, em um laço percorro as posições do vetor e faço a comparação para ver se existe um número igual, se tiver... gera outro número que não esteja no vetor..

 

Se ficou confuso... posto o código comentado...

 

--------------------------------------------------------------------

@edit

 

O amigo aí em cima já respondeu, não tinha atualizado aqui ainda !

 

 

brHUE

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.