Informática, perguntado por otavioluiz2014oyhxds, 1 ano atrás

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 de 5 números, gere estes dados
de modo a não ter números repetidos dentro das cartelas. O programa deve exibir na
tela a cartela gerada.
Linguagem C

Soluções para a tarefa

Respondido por bokomoko
8
Esse jogo não é bingo e sim loto.

No bingo tem letras e números. No loto só tem números. Mas isso é irrelevante .. vamos ao que interessa.

A pegadinha nessa tarefa é que cada cartela não pode ter dois números repetidos. Ou seja, a cartela tem 25 elementos (5x5) e todos devem ser distintos.
A primeira vista basta gerar 25 números aleatórios e tacar na cartela.
Acontece que o aleatório pode dar um número repetido então temos que testar se aquele número já foi usado naquela cartela.

Tem duas maneiras de testar isso: 
a cada número novo sorteado, varrer a cartela e testar se ele já está lá. Se estiver, sorteamos de novo e voltamos a testar se o número foi sorteado anteriormente até que sorteie um número novo. O problema dessa abordagem é que a cartela tem 25 números, está em forma de matriz e teremos que fazer cada vez mais comparações.

Um truque é criar um vetor de 100 posições, uma para cada número possível de ser sorteado e marcamos inicialmente com 0 (não sorteado). Cada vez que um número é sorteado, marcamos com 1. Assim, se o número for sorteado, basta testar se o elemento(número) do vetor tem 1, se tiver, sorteamos de novo até cair num que tenha 0. Bem mais simples.

Nesse exemplo, ainda existe um risco. A medida que  preenchemos a cartela a probabilidade do novo número sorteado ter aparecido antes aumenta
na primeira rodada  a probabilidade é 0
na segunda a probabilidade é de 1/100
na terceira é de 2/100
ou seja, quando chegarmos no 25o elemento a probabilidade é de 24/100 de precisarmos ter que sortear novamente. 
Isso não é problema pois essa probabilidade é baixa, pois temos 76/100 chances de acertar no primeiro sorteio para o 25o elemento
Porém, se a cartela tivesse 100 números, quando chegarmos ao centésimo número da carteira a chance de já ter sorteado um número é 99/100 ou seja, 1/100 de acertar de primeira. Examente porque depois de 99 números sorteados só resta um ser sorteado. 

O que quero dizer é que esse método serve para esse caso mas em outros casos é melhor usar outra técnica. Esse é um problema em que a estrutura do programa tem que ser modificada apenas pela probabilidade dos dados que serão manupulados. Muito interessante.

Segue o programa em C
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*
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 de 5
números, gere estes dados de modo a não ter números
repetidos dentro das cartelas. O programa deve exibir na
tela a cartela gerada.
*/
void imprime( int a[][5] ) {
  int i,j;
  for (i=0;i<4;i++){
    for (j=0;j<4;j++){
        printf("%6d",a[i][j]);
    };
    printf("\n");
  };
  printf("\n");
};

int main () {
  int cartela[5][5];
  int sorteados[100];
  int i,j,qual;
  srandom (time (0));
  for (i=0;i<99;i++) {
    sorteados[i] = 0;
  };
  
// carrega a matriz com números aleatórios entre 0 e 99
// sem repetição

  for (i=0;i<5;i++) {
    for (j=0;j<5;j++) {
      do {
        qual = (random() % 100 ) ; // gera um número entre 0 e 99
      } while (sorteados[qual]); // perigo !!! só funciona em 25 sobre 100
      cartela[i][j] = qual;
    };
  };

  printf("\nImprimir a Cartela\n");
  imprime(&cartela);
}

pode rodá-lo aqui
https://repl.it/@bokomoko/cartela-de-loto

Perguntas interessantes