Dev - C++ - Eliminar números repetidos de un arreglo (5x5) generado con números aleatorios

 
Vista:

Eliminar números repetidos de un arreglo (5x5) generado con números aleatorios

Publicado por Danilo (1 intervención) el 23/06/2020 05:49:04
Estimados

Tengo este código que genera números aleatorios (entre 1 y 100) y los asigna a las posiciones de memoria de un arreglo de 5x5. Debe descartar todos los números iguales a cero, y todos los números repetidos y asignar otro hasta que no se repita ninguno. La idea es generar cartones de bingo (ver imagen), por eso la casilla del centro es la única a la que forzosamente se le asigna un cero.

El problema se encuentra en la estructura de comparación (desde la fila 37 a la 49) de los números repetidos, no logro hacer que funcione.

Ojo que al ejecutarlo sucede que a veces genera cartones sin números repetidos, lo que crea la falsa impresión de que funciona, recomiendo generar 100 cartones para que se produzca un numero repetido en mas de un cartón.

Ayuda por favor!!!

d5d42fa0ca1a675aa22ac9c64107ba67o

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# include <iostream>
# include <cstdlib>
# include <time.h>
# include <conio.h>
 
using namespace std;
 
int i,j,b,v,k,r,s,bingo[5][5],cartones;
 
int main()
{
	srand (time (NULL));				// inicializa el generador de n° aleatorios
 
	cantidad:
	cout << "¿Cuantos cartones desea imprimir? (maximo 100): ";
	cin >> cartones;
	if (cartones>100 or cartones<1)		// valida que el numero de cartones este entre 1 y 100
	{
		cout << endl << "¡¡Ingrese un numero valido de cartones!!" << endl << endl;
		goto cantidad;					// devuelve al ingreso de cantidad de cartones
	}
 
	for(k=0;k<cartones;k++)				// cuenta los cartones impresos
	{
		for(i=0;i<5;i++)				// genera las filas para recorrer cada indice del arreglo
		{
			for(j=0;j<5;j++)			// genera las columnas para recorrer cada indice del arreglo
			{
				if (i==2 and j==2)				// detecta cuando estamos en el indice 12, corresponde al cuadrado central del carton
				{
					bingo[i][j] = 0;			// le asigna un cero, es una forma de dejarlo vacio
				}
				else							// para todos los demas casos asignara un n° aleatorio
				{
					asignacion:
					bingo[i][j]=rand()%101;		// asigna un n° aleatorio a cada indice del arreglo
					if (i>0 or j>0)				// comenzara a comparar cuando tenga 2 ingresos como minimo
					{
						for(b=0;b<i;b++)		// hace un barrido comparando las filas
						{
							for(v=0;v<j;v++)	// hace un barrido comparando las columnas
							{
								if (bingo[i][j] == bingo[b][v] or bingo[i][j] == 0)		// detecta n° repetidos o =0 y obliga a asignar otro n°
								{
									goto asignacion;
								}
							}
						}
					}						// el problema esta desde la fila 37 a la 49
				}
			}
		}
		for(r=0;r<5;r++)
		{
			for(s=0;s<5;s++)
			{
				cout << bingo[r][s] << " ";
			}
			cout << endl;
		}
		cout << endl << endl;
	}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Eliminar números repetidos de un arreglo (5x5) generado con números aleatorios

Publicado por Rodrigo (539 intervenciones) el 23/06/2020 07:14:58
Hay varias maneras de controlar repetidos, aqui explico una:

- Crea un arreglo de 100 booleanos (0 101, si quieres considerar el 0 tambien) o de enteros que valgan 0 y 1.
- La posicion i-esima del arreglo controla si el numero i ha sido usado antes o no.
- Antes de asignar, revisas el arreglo. Si ya esta en 1, ya ha sido elegido por lo que hay que repetir la eleccion.
- Cada vez que asignes un valor, modificas el elemento i-esimo para cambiarlo a 1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// definir
int usado[101];
int candidato;
 
// inicializar
for(int i=0; i <= 100; i++) { usados[i] = 0; }
 
....
 
// elegir un valor no usado
do {
    candidato.= rand() % 100 + 1; // eleccion entre 1 y 100 ambos inclusive
} while( usado[candidato] == 1 );
 
// marcarlo como usado
usado[candidato] = 1;
 
// asignar el candidato a la matriz

El problema con esta solucion es que mientras mas se eligen valores, mas cuesta elegir un valor que no este repetido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar