/
Inicio :: Foros

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

Generar valores aleatorios sin repetir ninguno
Ir a página Anterior  1, 2
 
      Índice del Foro elrincondelc.com -> Algoritmos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
rir3760



Registrado: 01 Oct 2004
Mensajes: 4086
Ubicación: Mexico

MensajePublicado: 05/12/2005 11:21 am
Título:

Para resumir y responder a cada uno de los puntos en concreto:


* En su primer mensaje psk indica que quiere realizar una determinada operacion mediante el enunciado que podemos sacar del codigo fuente de su programa:

Presentar 30 numeros que cumplan los requisitos:
1) Deben ser elegidos aleatoriamente.
2) Deben ser parte del universo de opciones: numeros enteros tipo int entre 100 y 200.

Para esto utiliza este algoritmo:
"Generar el universo de opciones un elemento a la vez, revisando que este elemento no se repita".


* A lo cual tu (me refiero a pitukilloloco) respondes con un programa que soluciona el enunciado de psk y tambien presenta un algoritmo distinto.


* Cuando tu publicaste tu mensaje yo estaba preparando el mio (me tarde casi una hora) y no lo hubiera publicado si me hubiera dado cuenta de este (tu mensaje) ya que el algoritmo que indique es el mismo:
"Almacenar el universo de opciones completo en un array, cada elemento en este universo de opciones se procesa y descarta".

El punto importante aqui que cabe señalar es que el objetivo de mi mensaje es indicarle a psk que utilize otro algoritmo para lo cual añadi un programa que ejemplifica este.

Pero en ningun momento mi intencion fue resolver el enunciado de psk. Me parece que el comprendio correctamente lo que yo trataba de decir cuando en uno de sus ultimos mensajes comenta:
psk escribió:
Una cosilla, entiendo lo que dices (pitukilloloco) y creo que también lo de rir3760. Me parece que ambos tenéis razón. Es cierto que coger los números como tú dices no es generar números aleatorios, pero realmente lo que hace el algoritmo de rir2760 (según he entendido) es:

Crea una tabla en la que almacena TODOS los posibles números teniendo el cuenta el rango que indica en enunciado.
Genera aleatoriamente un valor que hará de índice a la hora de leer el valor. De esta forma coge sólo un determinado número de valores de todos los posibles. El problema es que en su código de ejemplo genera 49 valores y usa los 49, de modo que otra persona que lo lee puede interpretar que simplemente los rebuja. Pero hay que tener en cuenta que el ejercicio puede pedir que se generen valores dentro de un rango de N elementos pero sólo requerir x de esos N.

ej:

Si necesita crear valores aleatorios entre 20 y 33, incluye en el array los elementos 20, 21,22...33.
Si de entre esos valores tiene que sacar 10, con un for que se ejecutará 10 veces genera valores aleatorios entre 0 y (33-20)=13 que se usarán de índice para acceder a 10 de los valores posibles.



* Por ultimo tanto tu programa como el mio son casi identicos y utilizan el mismo algoritmo, lo cual me parece que es bastante obvio y salta a la vista si revisamos con cuidado el codigo fuente de ambos programas. Lo unico que cambia en mi programa son los limites (lo cual por supuesto no afecta al algoritmo) y unos detales menores:

1) Mi programa solo utiliza un array por la sencilla razon de que en el caso particular que nos ocupa y que es la generacion de numeros enteros de tipo int utilizar dos arrays no es necesario.

2) El funcionamiento del bucle for en ambos programas es el mismo solo que mi programa utiliza un bucle for con un contador en decremento por la sencilla razon de que es mas compacto que utilizar un contador con incremento, que por cierto fue la primera aproximacion que tome y publique en este tema: como generar 10 numeros aleatorios que no se repitan.


* Y como ya indique, si quisieramos resolver el enunciado de psk con mi programa lo unico que habria que modificar serian los limites. Y si a eso le añadimos una semilla fija (la serie 1, 4, 13, ...) tendriamos el siguiente programa:
Código:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define NUM_ELEM    101
#define INCREMENTO  100
#define SUBCONJUNTO  30

int main(void)
{
   int num[NUM_ELEM], i, r;
   int cont, N;
   
   for (cont = N = 0; cont < 10; cont++){
     
      for (i = 0; i < NUM_ELEM; i++)
         num[i] = i + INCREMENTO;
     
      srand(N = N * 3 + 1);
     
      for (i = 0; i < SUBCONJUNTO; i++){
         r = rand() % (NUM_ELEM - i);
         printf(" %3d", num[r]);
       
         num[r] = num[NUM_ELEM - i - 1];
      }
      puts("");
   }
   
   return EXIT_SUCCESS;
}

La unica diferencia consiste en que utiliza el bucle con contador en incremento, esto para que procese las opciones en el mismo orden que tu programa.

Si modificamos tu programa para que utilize las mismas semillas para srand, lo cual es un cambio trivial:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SUBTOTAL 30
#define TOTAL 101
#define ORIGEN 100

int main(void)
{
   int i, array[SUBTOTAL], numeros[TOTAL], indice[TOTAL], numaleat;
   int cont, N;
   
   for (cont = N = 0; cont < 10; cont++){
     
      srand(N = N * 3 + 1);
     
      for (i = 0; i < TOTAL; i++){
         numeros[i] = ORIGEN + i;
         indice[i] = i;
      }
     
      for (i = 0; i < SUBTOTAL; i++){
         array[i] = numeros[indice[numaleat = rand() % (TOTAL - i)]];
         
         if (indice[numaleat] != TOTAL - i - 1)
            indice[numaleat] = indice[TOTAL - i - 1];
         
         printf (" %3d", array[i]);
      }
      puts("");
   }
   
   return EXIT_SUCCESS;
}


Tendriamos como resultado que ambos programas producen una salida que es identica.

Espero que esto haya aclarado la confusion.

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
psk



Registrado: 18 Nov 2005
Mensajes: 79

MensajePublicado: 05/12/2005 12:18 pm
Título:

Gracias a los dos por vuestras aportaciones.
Volver arriba
      Índice del Foro elrincondelc.com -> Algoritmos
Página 2 de 2Todas las horas están en GMT - 8 Horas
Ir a página Anterior  1, 2

 
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