Jump to content
Fórum Script Brasil
  • 0

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


renan_j
 Share

Question

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 to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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?

Edited by Aristóteles
Link to comment
Share on other 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 to comment
Share on other 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.

Edited by Aristóteles
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.2k
×
×
  • Create New...