[C++][Opiniones] Qué os parece esta forma de generar números aleatorios?

Iniciado por anonimo12121, 18 Marzo 2012, 17:28 PM

0 Miembros y 3 Visitantes están viendo este tema.

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.
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Xandrete

Bien. Aquí la implementación:

Código (cpp) [Seleccionar]
#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!

anonimo12121

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

Código (cpp) [Seleccionar]
#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 :) .
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Xandrete

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

¡Saludos, jefe!

maxim_o

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

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 :)
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

maxim_o

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

$Edu$

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.

maxim_o

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!

$Edu$

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.