| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
javi_606
Registrado: 05 Ene 2008 Mensajes: 24
| Publicado: 11/04/2008 10:57 pm | | | Título: Generador de IP´s aleatorias |
| Pues he encontrado por ahí un código que te genera ip´s aleatoriamente. Lo que quiero es que me expliquéis un poco cómo funciona el código, que quiero entenderlo bien porque me interesa mucho esto de los numeros aleatorios:
| Código: | #include <iostream.h> #include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) { unsigned int ip[4]; printf("Generador de IPs aleatorias de 4 octetos por Rojodos\n\n"); int i = 0; srand( (unsigned)time( NULL ) ); while ( i < 4){ ip[i] = rand()%255; i++; } printf ("IP generada: %d.%d.%d.%d\n", ip[0], ip[1],ip[2],ip[3]); system ("PAUSE"); return 0; } |
También quisiera saber como generar un numero aleatorio de 0 a 100 por ejemplo. La función srand no la entiendo. |
|
| Volver arriba | |
 |
cheroky
Registrado: 22 Sep 2005 Mensajes: 1411 Ubicación: En ecx esperando un call
| Publicado: 12/04/2008 8:42 am | | | Título: |
| Es un código que en realidad genera representaciones de direcciones IP v4. Cualquier dirección IP es un numero de 32 bits (2dec^32).
Para ver ejemplos más concisos sobre generación de números pseudoaleatorios con srand y rand usa el buscador del foro. _________________ The point is that programs are meant to be read by people, not just computers. |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 4181 Ubicación: Mexico
| Publicado: 12/04/2008 9:04 am | | | Título: |
| Ese programa tiene ciertos detallitos que si bien no son errores son "malas practicas" empezando por los nombres de los archivos de inclusion, la declaracion de la funcion main (no se usan los argumentos pasados mediante la linea de comandos), se utiliza la funcion time sin tener al alcanze ("in scope") su prototipo, etc.
Si uno debe apegarse de forma estricta al estandar de C++ el programa deberia ser:
| Código: | #include <iostream> using std::cout; using std::endl;
#include <cstdlib> using std::srand; using std::rand;
#include <ctime> using std::time;
int main() { int ip[4]; srand((unsigned) time(0)); for (int i = 0; i < 4; i++) ip[i] = rand() % 256; cout << "IP: " << ip[0] << '.' << ip[1] << '.' << ip[2] << '.' << ip[3] << endl; return 0; } |
En cuanto a las funciones que mencionas:
En C y C++ pueden generarse series de numeros seudo-aleatorios, antes de utilizar los valores de esa serie se debe definir la semilla o valor inicial para la generacion de estos. Esto se realiza mediante la funcion srand pasandole como argumento la mentada semilla.
Si no se utiliza la funcion srand esto es equivalente a utilizar:
Una vez definida la semilla para obtener la serie se llama a la funcion rand y esta devuelve el siguiente valor de la serie. El problema aqui es que si se utiliza el mismo valor como semilla se genera la misma serie. Como ejemplo practico puedes eliminar la llamada a srand (o cambiarla a "srand(1)") seguido de ejecutar el programa varias veces, si lo haces te daras cuenta que los valores generados son los mismos (en buen cristiano la salida del programa es siempre la misma).
Para evitar esto se suele utilizar como semilla algun valor que varie de alguna forma y este es (usualmente) la fecha del sistema. Es por esta razon que cuando se define la semilla mediante srand se indica que esta sera el valor de retorno de la funcion time (el tiempo del sistema).
Y para obtener un valor en un cierto rango basta con tomar el valor de retorno de la funcion rand y procesarlo mediante el operador de residuo:
El resultado de esa expresion es un valor entero (tipo int) en el rango 0 a N-1.
Por ultimo la funcion srand para que tenga los resultados esperados solo debe llamarse una sola vez al inicio del programa.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
|
cheroky
Registrado: 22 Sep 2005 Mensajes: 1411 Ubicación: En ecx esperando un call
| Publicado: 12/04/2008 10:09 pm | | | Título: |
| Por si ya has digerido algo de lo que has visto y te ha quedado el estomago intacto. Al hilo de lo que te comentaba puedes investigar un poco el tema de las ip y usar tu propia implementación de generación de direcciones
| Código: | #include <iostream> #include <ctime> #include <cstddef>
inline std::size_t xrand( ) { static std::size_t e = 1; if(e == 1) e = std::time( 0 ); e *= 432198765; return e % (0xffffffff-1); }
int main() { unsigned int ip; unsigned char *oct; ip = (1 + xrand() % 0xffffffff) ; //255.255.255.255 std::cout << "ip formato decimal ->" << ip << std::endl; oct = reinterpret_cast<unsigned char*> (&ip); std::cout << (int) oct[0] << "." << (int) oct[1] << "." << (int) oct[2] << "." << (int) oct[3] << std::endl; return 0; } |
S2. _________________ The point is that programs are meant to be read by people, not just computers. |
|
| Volver arriba | |
 |
|
|