Ir para conteúdo
Fórum Script Brasil
  • 0

Lógica do Bingo (random, sem repetição)


renan_j

Pergunta

Oi pessoal, boa tarde.

 

  • Fiz um código para o problema abaixo, mas parece que minha lógica está com algum furo. Já revisei, e não entendo o porque ainda tenho números repetidos. Alguém consegue me dar uma força? Obrigado!!

 

  • A lógica que eu pensei do código é a seguinte: Eu preencho um campo da matriz, com "i" e "j" e comparo com os anteriores, com "k" e "z". Caso este campo que acabei de preencher seja igual a um campo anterior, eu volto uma posição e começo o FOR novamente. Para isso, eu utilizei 4 variáveis i,j,k,z & um "aux" que serve como minha condicional para parada. 

 

  • Importante: Eu fiz o código com uma matriz 4x4 para testá-lo. Depois vou replicar para uma matriz 99x99.

 

  • Segue o problema: Faça um programa para gerar automaticamente números entre 0 e 99 de uma cartela de bingo. Sabendo que cada cartela deverá conter 5 linhas e 5 números, gere estes dados de modo a não ter números repetidos dentro da cartela.

 

  • Segue o Código: 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main () {

	int M[4][4], i,j,k,z, aux = 0;

	srand(time(NULL));
	
	for(i=0;i<4;i++){
		for(j=0;j<4;j++){
		
			aux = 0;
			M[i][j] = 1+ rand() % 16;
	
			for(k = i; k >= 0; k--){

				if(aux == 1){
					j = j - 1;
					break;
				}

				for(z = j; z >= 0; z--){
					if((M[k][z] == M[i][j] && k != i && z != j)){
						aux = 1;
						break;
					}
				}
			}
		}
	}
			

	printf("\n\n\n\n");

	for(i=0;i<4;i++){
		for(j=0;j<4;j++){
			printf("%d\t", M[i][j]);
		}
		printf("\n");
	}

	return 0;
}

 

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Dê uma olhada nestes dois exemplos dos links abaixo, ambos estão no meu blog, e o acesso é aberto

é claro, por que o jeito mais simples e eficiente é gerar os números através de um contador, e depois

embaralhar usando a função rand(); para as linhas e para as colunas,

para que os números gerados sejam diferentes a cada acesso, use a função srand();

Procure mais informações sobre o assunto que você encontra uma infinidade na internet.

http://codigosfontes-ccplus-plus.blogspot.com.br/2015/02/numeros-aleatorios-em-matriz-sem.html

http://codigosfontes-ccplus-plus.blogspot.com.br/2015/08/aleatorios-de-1-100-sem-repeticoes.html

Link para o comentário
Compartilhar em outros sites

  • 0
  • Segue o problema: Faça um programa para gerar automaticamente números entre 0 e 99 de uma cartela de bingo. Sabendo que cada cartela deverá conter 5 linhas e 5 números, gere estes dados de modo a não ter números repetidos dentro da cartela.

 

Se o importante é gerar números aleatórios para preencher uma cartela de bingo (sem repetir números), usar vetores simplifica a situação, e o cheque-mate é a impressão dos números na tela. Vamos lá:

#include <stdio.h>
#include <stdlib.h>

int main()

{

    srand(time(NULL));


    int cartela [24];

    int confere [24];

    int i, e, o;

    for (i =0; i < 24; i++)

    {

    cartela [i] = rand() % 99;

    for (e = 0; e < 24; e++)

    {

    confere [e] = cartela [i];

    while (confere [e] < 0)

    {

    for (o = confere [e]; o != 0; o--)

    {

    while (cartela [i] == confere [e])
    {
    cartela [i] = rand() % 99;
    }

    }


    confere [e] = confere [e - 1];
    }

    }

    }

printf ("---------------------------------");
printf ("\n [%d] - [%d] - [%d] - [%d] - [%d] \n", cartela [0], cartela [1], cartela [2], cartela [3], cartela [4]);
printf ("\n [%d] - [%d] - [%d] - [%d] - [%d] \n", cartela [5], cartela [6], cartela [7], cartela [8], cartela [9]);
printf ("\n [%d] - [%d] - [%d] - [%d] - [%d] \n", cartela [10], cartela [11], cartela [12], cartela [13], cartela [14]);
printf ("\n [%d] - [%d] - [%d] - [%d] - [%d] \n", cartela [15], cartela [16], cartela [17], cartela [18], cartela [19]);
printf ("\n [%d] - [%d] - [%d] - [%d] - [%d] \n", cartela [20], cartela [21], cartela [22], cartela [23], cartela [24]);
printf ("---------------------------------");

return 0;

}

 

 

Funfou?

Editado por Aristóteles
Link para o comentário
Compartilhar em outros sites

  • 0
37 minutos atrás, Aristóteles disse:
  • Segue o problema: Faça um programa para gerar automaticamente números entre 0 e 99 de uma cartela de bingo. Sabendo que cada cartela deverá conter 5 linhas e 5 números, gere estes dados de modo a não ter números repetidos dentro da cartela.

 

Se o importante é gerar números aleatórios para preencher uma cartela de bingo (sem repetir números), usar vetores simplifica a situação, e o cheque-mate é a impressão dos números na tela. Vamos lá:


#include <stdio.h>
#include <stdlib.h>

int main()

{

    srand(time(NULL));


    int cartela [24];

    int confere [24];

    int i, e, o;

    for (i =0; i < 24; i++)

    {

    cartela [i] = rand() % 99;

    for (e = 0; e < 24; e++)

    {

    confere [e] = cartela [i];

    while (confere [e] < 0)

    {

    for (o = confere [e]; o != 0; o--)

    {

    while (cartela [i] == confere [e])
    {
    cartela [i] = rand() % 99;
    }

    }


    confere [e] = confere [e - 1];
    }

    }

    }

printf ("---------------------------------");
printf ("\n [%d] - [%d] - [%d] - [%d] - [%d] \n", cartela [0], cartela [1], cartela [2], cartela [3], cartela [4]);
printf ("\n [%d] - [%d] - [%d] - [%d] - [%d] \n", cartela [5], cartela [6], cartela [7], cartela [8], cartela [9]);
printf ("\n [%d] - [%d] - [%d] - [%d] - [%d] \n", cartela [10], cartela [11], cartela [12], cartela [13], cartela [14]);
printf ("\n [%d] - [%d] - [%d] - [%d] - [%d] \n", cartela [15], cartela [16], cartela [17], cartela [18], cartela [19]);
printf ("\n [%d] - [%d] - [%d] - [%d] - [%d] \n", cartela [20], cartela [21], cartela [22], cartela [23], cartela [24]);
printf ("---------------------------------");

return 0;

}

 

 

Funfou?

Oi Aristoteles,

 

Obrigado pela resposta. Vou testar o seu código.

 

Eu revi minha lógica e consegui chegar em um consenso. O "5" foi apenas para testar o código, mas é só mudar os parâmetros. O teste pode ser feito com uma matriz completa, que não aceita repetição.  

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
 
int main () {
 
 
 
 
    int M[5][5], i,j,k,z,aux = 1;
 
 
    srand(time(NULL));
 
 
    for(i=0;i<5;i++){
        for(j=0;j<5;j++){
             
            aux = 1;
            M[i][j] = rand() % 100;
            for(k=0;k<5;k++){
                for(z=0;z<5;z++){
 
 
                    if((i == k && j == z) || (((k*5)+z) > ((i*5)+j))){
                        aux = 1;
                    }
                    else if(M[i][j] == M[k][z]){
                        aux = 0;
                        break;
                    }
                }
             
                if(aux == 0){
                    j = j -1;
                    break;
                }
            }   
        }
    }
 
 
 
 
 
 
    printf("Matriz Completa:\n");
    for(i=0;i<5;i++){
        for(j=0;j<5;j++){
            printf("%d\t", M[i][j]);
        }
        printf("\n");
    }
 
 
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

  • 0

Já foi resolvido, então ok.

 

Mas posto a versão revisada do meu código, pois o primeiro ficou muito ruim. xD

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

    int main()

    {

        int cartela [24], i, j, p, q = 0;


        srand(time(NULL));


        cartela [0] = rand() % 99;

        for (i = 0; i <= 24; i++)

        {

        cartela [i] = rand() % 99;

            for (j = i; j > 0; j--)

            {

                if (cartela [i - j] == cartela [i] && i != 0)

                {

                	cartela [i] = rand() % 99;

               		 j = i + 1;

                }

            }
        

		}
            
            

            

        for (p = 0; p <= 24; p++)
            
        {

				if (q == 4)
                
                {

				printf (" - %d - \n", cartela [p]);

				q = 0;		
			
				}	
			
				else
		
				{
				
			 	printf (" - %d - ", cartela [p]);

				q++;		
				
				}

				

		
		}
		

return 0;


	}

falou.

Editado por Aristóteles
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...