Foros del Web » Programación para mayores de 30 ;) » Programación General »

funcion aleatorios sin repetir(aporte)

Estas en el tema de funcion aleatorios sin repetir(aporte) en el foro de Programación General en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 13/09/2011, 20:49
 
Fecha de Ingreso: agosto-2008
Mensajes: 606
Antigüedad: 15 años, 8 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
  #2 (permalink)  
Antiguo 14/09/2011, 11:54
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: funcion aleatorios sin repetir(aporte)

Una pregunta pensaste en la posibilidad de agrandar el rango de los numeros aleatorios??
  #3 (permalink)  
Antiguo 14/09/2011, 12:11
 
Fecha de Ingreso: agosto-2008
Mensajes: 606
Antigüedad: 15 años, 8 meses
Puntos: 11
Respuesta: funcion aleatorios sin repetir(aporte)

Hola sam a que te refieres. Te digo que tengo una función que acabo de hacer implementando el algoritmo para que se le introduzca un rango en dos parámetros y te de aleatorios desde uno a otro. Siempre el primero siendo menor que el segundo.

Etiquetas: funcion, lenguaje, aleatoria
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 04:45.