Autor
|
Tema: Generar números aleatorios sin repeticiones. (Leído 3,531 veces)
|
serg2404
Desconectado
Mensajes: 11
|
tengo este código para generar números aleatorios sin que se repitan y guardarlos en una matriz, creo que se me queda en un loop infinito y no logro ver porque, he tratado de generar los números sin que se repitan de varias maneras y no lo logro, ayuda!! (el codigo esta incompleto, extraje la parte en la que necesito ayuda) Gracias #include <stdio.h> #include <stdlib.h> #include <time.h> #include <ctype.h> #include <windows.h> int tableroNumerico[6][6];// aqui va a estar el tablero numerico original int tableroNumerico2[6][6];//aqui va a estar el tablero desordenado char tableroFigura[6][6];//aqui va a estar el tablero con la figura original char tableroFigura2[6][6];//aqui va a estar el tablero desordenado int repetidos[34];//este vector es para revisar los numeros repetidos en el rand int generarNumero(int *c) { int numero; bool distinto=false; while(distinto==false) { srand(time(NULL ));//Cambio el seed con el tiempo de ese momento. int cont=0; for(int i=0; i<34; i++) { if(repetidos[i]==numero) cont++; } if(cont==0) { distinto=true; repetidos[*c]=numero; } } return numero; } void llenarTablero(char t) { int cont=0; int aux=0; if(t=='f') { } else { for(int i=0; i<6; i++) { for(int j=0; j<6; j++) { if(i==0 && j==5) tableroNumerico2[i][j]=0; else { aux=generarNumero(&cont); tableroNumerico2[i][j]=aux; cont++; } } } } } void mostrarTablero(char t) //Aqui imprimo el tablero despues de cada movimiento { if(t=='f') { } else { for(int i=0; i<6; i++) { for(int j=0; j<6; j++) { if(tableroNumerico2[i][j]==0) else printf("[ %i ]", tableroNumerico2 [i ][j ]); } } } } main() { for (int i=0; i<35; i++) repetidos[i]=0; char tipoTablero='n'; llenarTablero(tipoTablero) ; mostrarTablero(tipoTablero); }
|
|
« Última modificación: 2 Diciembre 2016, 02:28 am por serg2404 »
|
En línea
|
|
|
|
xustyx
Desconectado
Mensajes: 213
|
No se exactamente que es lo que quieres, pero ... ¿Por que no inicias la matriz con los números ordenados y luego la desordenas?
|
|
|
En línea
|
|
|
|
serg2404
Desconectado
Mensajes: 11
|
No se exactamente que es lo que quieres, pero ... ¿Por que no inicias la matriz con los números ordenados y luego la desordenas?
Lo que quiero es tener los números del 1 al 35 ordenados en la matriz, necesito que sea random ya que es para un juego y cada ves que se juegue debe empezar de manera distinta, no se si eso lo pueda hacer desordenando la matriz.
|
|
|
En línea
|
|
|
|
xustyx
Desconectado
Mensajes: 213
|
Entonces genera una matriz ordenada y luego desordenala. Será mas fácil.
Edito: Crea un vector de tamaño 36 con valores de 0 a 35, desordenalo y luego lo transformas a la matriz.
|
|
« Última modificación: 2 Diciembre 2016, 02:49 am por xustyx »
|
En línea
|
|
|
|
serg2404
Desconectado
Mensajes: 11
|
Entonces genera una matriz ordenada y luego desordenala. Será mas fácil.
Edito: Crea un vector de tamaño 36 con valores de 0 a 35, desordenalo y luego lo transformas a la matriz.
Ok, gracias! Intentare eso.
|
|
|
En línea
|
|
|
|
0xFer
Desconectado
Mensajes: 400
|
Debes hacer que el método srand se ejecute solo una vez al principio del programa en el método main, ahí en dónde lo pusiste hace que el número aleatorio generado se repita varias veces; 23 23 23 23 23 11 11 11 11 33 33 33 33. Otro detalles es que generas un número aleatorio de 34 posibles, y como tienes una matriz de 36 elementos es normal que falte 2 números más para que se pueda llenar la matriz sin que ninguno se repita. Cuidado con esto: for (int i=0; i<35; i++) repetidos[i]=0;
Te estás pasando del tamaño del vector
|
|
« Última modificación: 2 Diciembre 2016, 03:45 am por 0xFer »
|
En línea
|
int getRandomNumber(){ return 4; //chosen by fair dice roll //guaranteed to be random }
|
|
|
serg2404
Desconectado
Mensajes: 11
|
Debes hacer que el método srand se ejecute solo una vez al principio del programa en el método main, ahí en dónde lo pusiste hace que el número aleatorio generado se repita varias veces; 23 23 23 23 23 11 11 11 11 33 33 33 33. Otro detalles es que generas un número aleatorio de 34 posibles, y como tienes una matriz de 36 elementos es normal que falte 2 números más para que se pueda llenar la matriz sin que ninguno se repita. Cuidado con esto: for (int i=0; i<35; i++) repetidos[i]=0;
Te estás pasando del tamaño del vector Ok, cambie el srand al main, lleno manualmente uno de los espacios con 0(necesito que este en ese espacio especifico) entonces me quedan 35 números por arreglar, cambie el vector repetidos a uno de 35 espacios y aun me da un bucle .
|
|
|
En línea
|
|
|
|
0xFer
Desconectado
Mensajes: 400
|
Bueno entonces te corrijo el código: #include <stdio.h> #include <stdlib.h> #include <time.h> #include <ctype.h> #include <windows.h> int tableroNumerico[6][6];// aqui va a estar el tablero numerico original int tableroNumerico2[6][6];//aqui va a estar el tablero desordenado char tableroFigura[6][6];//aqui va a estar el tablero con la figura original char tableroFigura2[6][6];//aqui va a estar el tablero desordenado int repetidos[36];//este vector es para revisar los numeros repetidos en el rand int generarNumero(int *c) { int numero; bool distinto=false; while(distinto==false) { int cont=0; numero=rand()%35+1; for(int i=0; i<36; i++) { if(repetidos[i]==numero) cont++; } if(cont==0) { distinto=true; repetidos[*c]=numero; } } return numero; } void llenarTablero(char t) { int cont=0; int aux=0; if(t=='f') { } else { for(int i=0; i<6; i++) { for(int j=0; j<6; j++) { if(i==0 && j==5){ tableroNumerico2[i][j]=0; repetidos[i*j] = 0; } else { aux=generarNumero(&cont); tableroNumerico2[i][j]=aux; } cont++; } } } } void mostrarTablero(char t) //Aqui imprimo el tablero despues de cada movimiento { if(t=='f') { } else { for(int i=0; i<6; i++) { for(int j=0; j<6; j++) { if(tableroNumerico2[i][j]==0) printf("[ ]"); else printf("[ %i ]", tableroNumerico2[i][j]); } printf(" \n"); } } } main() { srand(time(NULL));//Cambio el seed con el tiempo de ese momento. for (int i=0; i<36; i++) repetidos[i] = 999; //cualquier numero que este fuera del intervalo [0 - 35] char tipoTablero='n'; llenarTablero(tipoTablero) ; mostrarTablero(tipoTablero); system("pause"); }
|
|
|
En línea
|
int getRandomNumber(){ return 4; //chosen by fair dice roll //guaranteed to be random }
|
|
|
serg2404
Desconectado
Mensajes: 11
|
Bueno entonces te corrijo el código: #include <stdio.h> #include <stdlib.h> #include <time.h> #include <ctype.h> #include <windows.h> int tableroNumerico[6][6];// aqui va a estar el tablero numerico original int tableroNumerico2[6][6];//aqui va a estar el tablero desordenado char tableroFigura[6][6];//aqui va a estar el tablero con la figura original char tableroFigura2[6][6];//aqui va a estar el tablero desordenado int repetidos[36];//este vector es para revisar los numeros repetidos en el rand int generarNumero(int *c) { int numero; bool distinto=false; while(distinto==false) { int cont=0; numero=rand()%35+1; for(int i=0; i<36; i++) { if(repetidos[i]==numero) cont++; } if(cont==0) { distinto=true; repetidos[*c]=numero; } } return numero; } void llenarTablero(char t) { int cont=0; int aux=0; if(t=='f') { } else { for(int i=0; i<6; i++) { for(int j=0; j<6; j++) { if(i==0 && j==5){ tableroNumerico2[i][j]=0; repetidos[i*j] = 0; } else { aux=generarNumero(&cont); tableroNumerico2[i][j]=aux; } cont++; } } } } void mostrarTablero(char t) //Aqui imprimo el tablero despues de cada movimiento { if(t=='f') { } else { for(int i=0; i<6; i++) { for(int j=0; j<6; j++) { if(tableroNumerico2[i][j]==0) printf("[ ]"); else printf("[ %i ]", tableroNumerico2[i][j]); } printf(" \n"); } } } main() { srand(time(NULL));//Cambio el seed con el tiempo de ese momento. for (int i=0; i<36; i++) repetidos[i] = 999; //cualquier numero que este fuera del intervalo [0 - 35] char tipoTablero='n'; llenarTablero(tipoTablero) ; mostrarTablero(tipoTablero); system("pause"); }
Mil gracias, no lograba salir de este problemita jajaja
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Generar numeros aleatorios sin repeticion[C]
Programación C/C++
|
HRSLASH
|
2
|
25,335
|
28 Diciembre 2010, 06:58 am
por von Newman
|
|
|
Generar números aleatorios sin que se repitan ... en C++
Programación C/C++
|
drawiz
|
4
|
27,988
|
17 Octubre 2019, 07:46 am
por Mecanma
|
|
|
Programa para generar numeros aleatorios
Programación C/C++
|
pedrokuellar
|
8
|
8,254
|
24 Octubre 2011, 22:37 pm
por s00rk
|
|
|
Como generar numeros aleatorios pares?
Programación C/C++
|
lucas59
|
4
|
14,164
|
1 Octubre 2014, 18:12 pm
por Shout
|
|
|
Generar numeros aleatorios sin que se repitan
Programación C/C++
|
Mecanma
|
1
|
3,845
|
17 Octubre 2019, 06:28 am
por Serapis
|
|