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
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
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