Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/09/2011, 20:49
trevol
 
Fecha de Ingreso: agosto-2008
Mensajes: 606
Antigüedad: 15 años, 9 meses
Puntos: 11
funcion aleatorios sin repetir(aporte)

Hola amigos, la verdad es que siempre me intrigo que fuera tan difícil de encontrar por internet una función que fuera eficiente, para obtener aleatorios sin repeir. De todas formas me gustaría que ustedes la comparan con otras haber si estoy en lo cierto pero de las que yo he visto y he realizado antes, ésta la supongo la mas eficiente, ya que todo sucede en un bucle y no se utilizan if. Yo os dejo digamos una función base luego si se quiere adaptar a necesidades particulares es muy fácil implementar el algoritmo, la he escrito en varios lenguajes pero por ser c el mas conocido o parecido a los demás la he publicado en c, ni que decir tiene que acepto todo tipo de críticas. Haber que os parece.
Código C++:
Ver original
  1. #include<iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5.  void aleatoriosSinRepetir(){
  6.     int i=0;//contador para bucle.
  7.     int ale;//números aleatorios que irán generándose.
  8.     int auxiliar;//la utilizare para cambiar el valor de una variable por otra.
  9.     int intervalo2=10;//máximo valor del intervalo para aleatorio.
  10.     int intervalo=0;//mínimo valor del intervalo para aleatorio.
  11.     int aleatorio[10]={1,2,3,4,5,6,7,8,9,10};//matriz con los diez números. //aleatorios a obtener
  12.  
  13.      srand(time(NULL));//semilla para obtener aleatorios distintos cada vez.
  14.  
  15.  
  16.     for (i=0; i<10; i++){
  17.        
  18.        ale=intervalo+rand()%intervalo2;//genero aleatorio que utilizare como indice.
  19.        auxiliar=aleatorio[i];//guardo en auxiliar aleatorio
  20.       aleatorio[i]=aleatorio[ale];//introduzco el primer aleatorio en el indice //correspondiente.
  21.       cout<<aleatorio[i]<<endl;//muestro primer aleatorio.
  22.       aleatorio[ale]=auxiliar;//introduzco el aleatorio[i] ya que previamente lo metí //en auxiliar
  23.        intervalo++;//a intervalo mínimo le sumo 1.
  24.        intervalo2--;//a intervalo máximo le resto una.
  25.    
  26.         }
  27.        
  28.         }
  29.        
  30.  
  31. int main()
  32. {
  33.     aleatoriosSinRepetir();//llamo a la funcion.
  34.        
  35.         system("pause");
  36. }

La idea es ir leyendo de un array los indices de forma aleatoria e ir intercambiando el numero saliente por el primer indice luego el segundo numero saliente por el segundo ectr.. mientras acoto la posibilidad de que salgan los números anteriores restando le al intervalo uno cada vez, de forma que el numero aleatorio primero que se guarda en el indice primero ya no podrá salir mas, y asi sucesivamente.
pd: la función la he escrito sin consultarla con nadie ustedes son los primeros espero que si se puede mejorar se mejore entre todos.

Última edición por trevol; 13/09/2011 a las 20:56