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

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

0 Miembros y 1 Visitante están viendo este tema.

Eternal Idol

Cita de: Anastacio en 19 Marzo 2012, 23:09 PMUna pregunta que a ustedes les parecera tonta si duda, pero bueno, la verdad, entiendo poco (si no quieren no la conteste pero plis que nadie me banee), para que se usa #define?

Ya que no sos capaz de conseguir un libro del tema y leerlo al menos aprende a usar:
Google.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Anastacio

You, stop to close my post, you were novice too!!!!!!!!!!!!

Eternal Idol

Cita de: Anastacio en 19 Marzo 2012, 23:27 PM
Bueno, buscare en google.

Al parecer no se permiten novatos.

En todo caso:
No se permiten vagos.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

anonimo12121

#13
He generado un segundo código aun lo tengo que mejorar xD, pero no se si sabéis por donde van los tiros xDD. Se que algunos lo haríais rápido xD
Fallo 1: aveces no crea nada, por qué el numero generado sigue siempre un patrón...
Fallo 2: aveces se cuela un mismo numero en un cuadrante X(...
Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
time_t tiempo;
struct tm *pt;
int semilla;
int lista[9][9];
int numero;
void Generator(){
   for(int z=0,x=0,y=0,c1=0,c2=0;y<9;z++){
       tiempo=time(NULL);
       pt=localtime(&tiempo);
       semilla=pt->tm_sec+pt->tm_yday+pt->tm_min+z;
       srand(semilla);
       numero=rand() % 10;
       for(int i=0;i<9;i++){
           if(numero!=lista[y][i]){
               c1++;
           }
       }
       if(c1==9){
           for(int i=0;i<9;i++){
               if(numero!=lista[i][x]){
                   c2++;
               }
           }
       }
       if(c1==9 && c2==9){
           lista[y][x]=numero;
           x++;
       }
       if(x==9){
           x=0;
           y++;
       }
       c1=0;
       c2=0;
   }
}
int main(int argc,char *argv[]){
   Generator();
   //////////////////////////////////////
   //// IMPRIMIR /////////////////////////
   for(int y=0;y<9;y++){
       cout << "\nLine -> ";
       for(int x=0;x<9;x++){
           cout << lista[y][x] << "-";
       }
   }
   cout << endl;
   cout << "GAME OVER";
   return 0;
};


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

$Edu$

No te gustaron las soluciones mia y de Sagrini que es parecida?

anonimo12121

no jijiji. aún así la mía esta mal. tengo que arreglarla.
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

$Edu$

Por eso te digo, la idea es mirar codigos de otros programadores y tratar de modificarlos para optimizarlos no para empeorarlos. Es solo un consejo, no te lo tomes a mal. Saludos

anonimo12121

no ya. solo que quiero primero intentar hacer el código que busco y luego mejorarlo.
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

¡Hola!

Tu manera de hacerlo es correcta (y eso es lo más importante). Otra manera sería mantener un vector de booleanos en el que marques los elementos que ya has cogido (así no tienes que hacer una búsqueda entre los elementos que ya han salido).

Propongo también esto otro, con listas circulares (y aprovechando que generas elementos entre 0 y 9 únicamente). Me he hecho una clase llamada clist que básicamente es eso, una lista circular. Aquí como resuelvo el problema usando esa clase:

Código (cpp) [Seleccionar]
#include <iostream>
#include "circlist/clist.hpp"

int main() {
clist<int> cl;
for (int i = 0; i < 10; ++i) {
cl.insert(i);
cl.rand_sel();
}
for (int i = 0; i < 10; ++i) {
cout << cl.elem() << endl;
++cl;
}
}


Y aquí el fichero de cabecera de la clase:

Código (cpp) [Seleccionar]

#ifndef NULL
#define NULL 0
#endif

template <class T>
class clist {

private:

struct Node {
T info;
Node* next;
Node* prev;
};
T hola;
Node* act;
int s;

public:

clist();

~clist();

// Returns the element pointed by act
T elem() const;

// Returns the number of elements of the circular list
int size() const;

// Returns true if there isn't any element in the list. False otherwise
bool empty() const;

// Overloaded = operator
clist& operator=(const clist& cl);

// Insert element inf before the element pointed by act
void insert(const T& inf);

// Erases the element pointed by act from the list
void erase();

// Makes act := act->next
void operator++();

// Makes act := act->prev
void operator--();

// Makes act point to a random element of the list
void rand_sel();

};

#include "clist.cpp"


Si alguien quiere la implementación de las funciones (clist.cpp), ya me lo hará saber. No lo pongo aquí para no hacer el post demasiado largo.

De hecho, he utilizado este mismo método para hacer un pequeño buscaminas y decidir en que casillas estarán las minas ^^. Aunque, de todas formas, lo más eficiente en tiempo es lo del vector de booleanos.

Saludos.

PS: por cierto, un detalle. No hace falta que cambies la semilla en cada iteración. No ganas casi nada y pierdes tiempo. Es mejor hacer el srand al principio del programa y ya está.