Autor
|
Tema: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios? (Leído 18,458 veces)
|
anonimo12121
|
haber ponlo aquí no te preocupes por el tamaño del post. Ahora mismo estoy haciendo un diseño que valga para el sudoku y estoy usando un método bas de unos cuantos if que comprueba en el cuadrante que esta Y.X cada vez para que no haya ningun número similar ni el fila ni el la columna ni en el cuadrante.
|
|
|
En línea
|
|
|
|
Xandrete
Desconectado
Mensajes: 210
|
Bien. Aquí la implementación: #include <cstdlib> #include <ctime> using namespace std; template <class T> clist<T>::clist() { srand(time(NULL)); act = NULL; s = 0; } template <class T> clist<T>::~clist() { while (act != NULL) erase(); } template <class T> T clist<T>::elem() const { return act->info; } template <class T> int clist<T>::size() const { return s; } template <class T> bool clist<T>::empty() const { return s == 0; } template <class T> clist<T> &clist<T>::operator=(const clist& cl) { while (act != NULL) erase(); if (cl.act != NULL) { insert(cl.act->info); Node* aux = cl.act->next; while (aux != cl.act) { insert(aux->info); aux = aux->next; } s = cl.s; } return *this; } template <class T> void clist<T>::insert(const T& inf) { Node* n = new Node; n->info = inf; if (act != NULL) { n->next = act; n->prev = act->prev; act->prev->next = n; act->prev = n; } else { n->next = n; n->prev = n; act = n; } ++s; } template <class T> void clist<T>::erase() { if (act != NULL) { if (act == act->next) { delete act; act = NULL; } else { act->next->prev = act->prev; act->prev->next = act->next; Node* aux = act->prev; delete act; act = aux; } --s; } } template <class T> void clist<T>::operator++() { if (act != NULL) act = act->next; } template <class T> void clist<T>::operator--() { if (act != NULL) act = act->prev; } template <class T> void clist<T>::rand_sel() { if (s > 0) { int r = rand()%s; while (r--) act = act->next; } }
Quiero aclarar que esta clase no la he hecho sólo para esto. ¡Saludos!
|
|
|
En línea
|
|
|
|
anonimo12121
|
Gran código has puesto desde luego le voy a echar mi tiempo para verlo y aprenderlo puesto que he visto mientras bajaba la pantalla para darle a responder clases XD. Aquí pongo el código que buscaba terminado, aunque me decepciona puesto que Xeracker, ya lo había echo antes y con 14 años xD. Es para generar sudoku #include <iostream> #include <stdlib.h> #include <time.h> using namespace std; int lista[10][10]; int num=0; void Generator(){; srand(time(0)); for(int y=1;y<10;y++){ for(int x=1;x<10;x++){ int c=0; for(bool ok=false ;ok==false;c++){ num=0;ok=true; while(num==0)num=rand()%10; for(int i=x;i>0;i--)if(lista[y][i]==num)ok=false; for(int i=y;i>0;i--)if(lista[i][x]==num)ok=false; if((y%3==2) && (x%3==1) && ((num==lista[y-1][x+1]) || (num==lista[y-1][x+2]) ))ok=false; if((y%3==2) && (x%3==2) && ((num==lista[y-1][x-1]) || (num==lista[y-1][x+1]) ))ok=false; if((y%3==2) && (x%3==0) && ((num==lista[y-1][x-2]) || (num==lista[y-1][x-1]) ))ok=false; if((y%3==0) && (x%3==1) && ((num==lista[y-2][x+1]) || (num==lista[y-2][x+2]) || (num==lista[y-1][x+1]) || (num==lista[y-1][x+2])))ok=false; if((y%3==0) && (x%3==2) && ((num==lista[y-2][x-1]) || (num==lista[y-2][x+1]) || (num==lista[y-1][x-1]) || (num==lista[y-1][x+1])))ok=false; if((y%3==0) && (x%3==0) && ((num==lista[y-2][x-2]) || (num==lista[y-2][x-1]) || (num==lista[y-1][x-2]) || (num==lista[y-1][x-1])))ok=false; if(c==50){ x=1; y=1; } } lista[y][x]=num; } } } int main(int argc,char *argv[]){ Generator(); ////////////////////////////////////// //// IMPRIMIR ///////////////////////// for(int y=1;y<10;y++){ cout << "\nLine -> "; for(int x=1;x<10;x++){ cout << lista[y][x] << "-"; } } return 0; };
Que !! bonito queda . Haber si mañana ya termino este proyecto .
|
|
« Última modificación: 22 Marzo 2012, 02:28 am por Dr.Hacker++ »
|
En línea
|
|
|
|
Xandrete
Desconectado
Mensajes: 210
|
Claro, es bastante código. Pero ten en cuenta que es la implementación completa de una lista circular. Cuando usas los vectores o las listas de la STL es verdad que tu programa queda muy bonito y tal, pero detrás está la implementación de esas clases que es mucho más grande y compleja que ésta (que, en comparación, es bastante simplona). Suerte con el proyecto ¡Saludos, jefe!
|
|
|
En línea
|
|
|
|
maxim_o
Desconectado
Mensajes: 186
|
Estaba viendo el post, e intente generar los numeros aleatorios, estilo como el sudoku en una matriz que no se repitan en filas y columnas para ir cogiendo practica otra vez pero puff algo no funciona, se mete en un bucle infinito o algo y no se por que #include <iostream> #include <stdlib.h> #include <time.h> #define TAM 9 using namespace std; bool repite (int aleatorio , int matriz[TAM][TAM] , int i , int j ); int main(int argc , char *argv[]){ srand((unsigned)time(NULL)); int aleatorio,matriz[TAM][TAM]; bool norepite=false; for (int i=0;i<TAM;i++) { for(int j=0;j<TAM;j++){ do{ aleatorio=rand()%9+1; norepite=repite(aleatorio , matriz , i , j); }while(norepite!=true); matriz[i][j]=aleatorio; } } for (int i=0;i<TAM;i++){ for(int j=0;j<TAM;j++) cout << " " << matriz[i][j]; cout << "\n"; } return 0; }
bool repite (int aleatorio , int matriz[TAM][TAM] , int i, int j){ int cont=0;
for(int p=0;p<TAM;p++) if(matriz[p][j]!=aleatorio){ cont++; } for(int p=0;p<TAM;p++) if(matriz[i][p]!=aleatorio) cont++; if(cont==18) return true; return false;
}
Por cierto, como añadir las librerias estandar de c/c++ en qt creator, cuando escribo el código ahi, me dice que no estan en el directorio, como puedo añadirlas (el g++ si compila)? Gracias de Antemano
|
|
« Última modificación: 24 Marzo 2012, 13:31 pm por maxim_o »
|
En línea
|
|
|
|
anonimo12121
|
El problema se deberá a que en un punto del bucle se genera siempre el mismo numero entonces no puede pasar por que ya existe en la array el número. eso creo yo, no he mirado tu código pero me paso muchas veces
|
|
|
En línea
|
|
|
|
maxim_o
Desconectado
Mensajes: 186
|
Si, algo de eso tiene que ser pero pufff no se por que No encuentro la solucion por mas que le doy vueltas , sigo viendo "lógico" el codigo aunque igual esté mal implementado o mal echo y no "haga" lo que pienso....
|
|
|
En línea
|
|
|
|
$Edu$
Desconectado
Mensajes: 1.842
|
No se C++ pero desde hace tiempo he visto codigos aca en el foro y nunca vi que pongan como pusiste vos:
bool repite (int aleatorio , int matriz[TAM][TAM] , int i , int j );
Asi, como declarando la funcion y luego la dejas abajo con su cuerpo. Si fue esa linea la que hiciste mal entonces es que te esta tomando esa linea como la funcion "repite" y entonces devolvera falso siempre, lo que entonces no terminara mas el bucle do-while que hiciste luego.
Si estoy equivocado quiero que me expliquen el porque de "declarar" la funcion antes.
|
|
|
En línea
|
|
|
|
maxim_o
Desconectado
Mensajes: 186
|
Pues esa linea creo que está bien (la declaracion) En C/C++ las funciones deben estar declaradas antes del main. Esto se debe a que el compilador entra en el main y llega a la funcion y no la conoce entonces da error. Al estar declarada le estás diciendo al compilador que esa función está. Si la funcion la pones antes del main no hace falta declararla....
Creo que esto es así, si me equivoco, retifiquenme please!
|
|
|
En línea
|
|
|
|
$Edu$
Desconectado
Mensajes: 1.842
|
Esque si, eso lo he visto a lo que dices, pero hace la prueba, quita esa linea que dije y copia tu funcion "repite" con todo el cuerpo y ponela antes del main y ahi si compila y corre la aplicacion a ver si por lo menos deja de entrar en un bucle infinito, si es asi, tengo razon.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[Pregunta] Como generar números aleatorios no repetidos
Programación Visual Basic
|
Dreamaker
|
6
|
6,824
|
20 Julio 2010, 02:24 am
por Fitoschido
|
|
|
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
|
|
|
Una nueva forma de generar números aleatorios aumentaría la seguridad del ...
Noticias
|
wolfbcn
|
0
|
1,215
|
19 Mayo 2016, 21:31 pm
por wolfbcn
|
|