Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Números aleatorios y listas enlazadas

Estas en el tema de Números aleatorios y listas enlazadas en el foro de C/C++ en Foros del Web. Hola, buenas tardes! Traigo una duda al foro, con el fin de poder encontra a alguien que me ayude. Acabo de terminar primero de ingeniería ...
  #1 (permalink)  
Antiguo 10/07/2013, 08:14
Avatar de LydiaH  
Fecha de Ingreso: julio-2013
Ubicación: Ávila, España
Mensajes: 15
Antigüedad: 10 años, 9 meses
Puntos: 0
Pregunta Números aleatorios y listas enlazadas

Hola, buenas tardes!
Traigo una duda al foro, con el fin de poder encontra a alguien que me ayude. Acabo de terminar primero de ingeniería informática, el problema es el siguiente:

Estoy realizando un programa en C que hace uso de las listas enlazadas, funciones y números aleatorios. El objetivo del programa es realizar una lista enlazada con números aleatorios. Cada vez que el usuario solicite "añadir un nuevo nodo" se debe incluir un nuevo nodo a la lista enlazada que incluye a su vez un número aleatorio. También se deben colocar ordenados (al ser añadidos) en la lista enlazada aunque este no es el problema.

Mi problema es que he realizado una función con el siguiente prototipo:

Código C:
Ver original
  1. void CreaListaAleatoria(NODO**);

En la definición de tipos he definido NODO tipo de estructura de la siguiente manera:

Código C:
Ver original
  1. typedef struct nodo
  2. {
  3.    int num;
  4.    struct nodo *sig;
  5. }NODO;

He declarado una lista enlazada NODO*lista; y la he inicializado para poder usarla
lista=NULL;

El desarrollo de la función es el siguiente:
Código C:
Ver original
  1. /*Esta función añade a la lista enlazada nodos cuyo valor de num es un número
  2. aleatorio. Los añade a la lista de forma ordenada*
  3.  
  4. void CreaListaAleatoria (NODO** lista)
  5. {
  6.    //Declaración de variables
  7.    NODO*nuevo;
  8.    NODO*indice;
  9.    NODO*anterior;
  10.    int num_aleatorio=0;
  11.  
  12.    anterior=NULL;
  13.    indice=*lista; //Con indice recorreremos la lista enlazada
  14.    
  15.    /*Obtenemos un número aleatorio en función del reloj del ordenador*/
  16.    srand (time(0));  
  17.    num_aleatorio = rand ()% RANGO;
  18.  
  19.  /*Asignación de memoria dinámica para el nuevo nodo.*/
  20.    nuevo = (NODO*) malloc (sizeof(NODO));
  21.    
  22.   /*Asignación de num_aleatorios al campo 'num' del nodo nuevo*/
  23.    nuevo->num = num_aleatorio;
  24.    
  25.   /*Si la lista está vacia, insertamos el nodo como primero de la lista*/
  26.    if(indice==NULL)
  27.    {
  28.       *lista=nuevo;
  29.        nuevo->sig=NULL;
  30.    }
  31.    
  32.    else
  33.    {
  34.      /*Recorremos la lista hasta encontrar un nodo con un número mayor al que
  35.      queremos insertar, o bien hasta llegar al final de la lista*/
  36.      while((indice->num < num_aleatorio)&&(indice->sig!=NULL))
  37.      {
  38.        anterior=indice;
  39.        indice=indice->sig;
  40.      }
  41.      
  42.   /*Si el indice apunta a NULL significa que no hay ningún nodo con un número
  43.     mayor y que por lo tanto se añadirá al finalizar la lista*/
  44.     if((indice->sig==NULL)&&(indice->num<num_aleatorio))
  45.      {
  46.        nuevo->sig=NULL;
  47.        indice->sig=nuevo;
  48.      }
  49.    
  50.    /*Si anterior apunta a NULL entonces el nodo se inserta como primero de la
  51.     lista*/
  52.     else if(anterior==NULL)
  53.     {
  54.       nuevo->sig=*lista;
  55.       *lista=nuevo;
  56.     }
  57.    
  58.     /*Sino, el nodo se inserta en mitad de la lista en el lugar que le corresponda*/
  59.  
  60.     else
  61.     {
  62.       nuevo->sig=indice;
  63.       anterior->sig=nuevo;
  64.     }
  65.   }
  66. }

(Espero que se entienda, es la primera vez que publico un fragmento de código en un foro)
La función a la hora de ordenar funciona bien. El problema es que a la hora de añadir nuevos nodos, los números aleatorios se repiten, es decir, se genera un número aleatorio y se repite continuamente en todos los nodos. Supongo que es porque al ser operaciones que se realizan en muy poco tiempo no se modifica el reloj del ordenador y no se generan números nuevos aleatorios. No se como solucionarlo, seguramente se puede crear este programa utilizando otras funciones con otros argumentos, no me exigen que sea así, pero a mi me gustaría saber si existe algún modo de resolverlo sin tener alterar todo el código del programa.

Muchas gracias!!! Un saludo!
  #2 (permalink)  
Antiguo 10/07/2013, 11:41
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Números aleatorios y listas enlazadas

Cita:
srand (time(0));
Quita esto y ponlo al principio del main
  #3 (permalink)  
Antiguo 10/07/2013, 11:55
Avatar de LydiaH  
Fecha de Ingreso: julio-2013
Ubicación: Ávila, España
Mensajes: 15
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Números aleatorios y listas enlazadas

Vaya!! Que guay! Gracias de verdad, me has quitado un dolor de cabeza, pero ... La verdad no entiendo por qué en la función no me funciona y en el main si.
  #4 (permalink)  
Antiguo 10/07/2013, 13:43
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Números aleatorios y listas enlazadas

Cita:
Iniciado por LydiaH Ver Mensaje
Vaya!! Que guay! Gracias de verdad, me has quitado un dolor de cabeza, pero ... La verdad no entiendo por qué en la función no me funciona y en el main si.
Porque cada vez que llamas a la función, reinicializas el generador. Dado que ni siquiera habrá pasado un segundo, tendrás la misma semilla y por tanto los mismos números aleatorios.

Para evitar esto, lo mejor es inicializar la semilla una sola vez.
  #5 (permalink)  
Antiguo 10/07/2013, 13:58
Avatar de LydiaH  
Fecha de Ingreso: julio-2013
Ubicación: Ávila, España
Mensajes: 15
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Números aleatorios y listas enlazadas

Cita:
Iniciado por amchacon Ver Mensaje
Porque cada vez que llamas a la función, reinicializas el generador. Dado que ni siquiera habrá pasado un segundo, tendrás la misma semilla y por tanto los mismos números aleatorios.

Para evitar esto, lo mejor es inicializar la semilla una sola vez.
Es verdad!! No lo entendía pero ya lo he pillado gracias de nuevo :)

Etiquetas: enlazadas, listas, numeros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:38.