/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Generador de IP´s aleatorias

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
javi_606



Registrado: 05 Ene 2008
Mensajes: 24

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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:
Código:
srand(1);


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:
Código:
rand() % N;

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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com