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

Numero aleatorio sin que se repita

Estas en el tema de Numero aleatorio sin que se repita en el foro de Java en Foros del Web. Hola buenas, estoy haciendo un progama que pasandole numeros por teclado genera numeros aleatorios entre un rango que se la pasa, siempre entre 1 (este ...
  #1 (permalink)  
Antiguo 26/01/2009, 02:45
 
Fecha de Ingreso: enero-2009
Mensajes: 5
Antigüedad: 15 años, 3 meses
Puntos: 0
Numero aleatorio sin que se repita

Hola buenas, estoy haciendo un progama que pasandole numeros por teclado genera numeros aleatorios entre un rango que se la pasa, siempre entre 1 (este es el unico numero predeterminado) y X, y también la cantidad de aleatorios que quiero que genere.
Por ejemplo le digo que entre 1 y 500 me genere 300 aleatorios, le doy al boton y alejop!!!.
Hasta aqui todo correcto, el problema aparece ahora, he estado mirando un monton de foros, post diferentes y libros y no hay forma de que salga, no consigo que no se me repitan los aleatorios generados.
Este es el código que tengo si alguien me puede ayudar con algun consegillo.


try
{

FileWriter flS=new FileWriter("c:\\Documents and Settings\\Adm\\Generacion\\Canciones.txt");
BufferedWriter fS=new BufferedWriter (flS);
for (int i=0; i<=total; i++)
{
int valorEntero= (int)Math.floor(Math.random()*(maximo-fijo+1)+fijo);
String creado=String.valueOf(valorEntero);
caja5.setText(letra+creado);


//Este es uno de los ultimos codigos con los que lo he intentado
//y creo que estaba cerca
/*int n=valorEntero;
int k=n;
int[] numeros=new int[n];
int[] resultado=new int[n];

for(int p=0;i<n;p++){
numeros[p]=p+1;
}

for(int p=0;p<n;p++){

resultado[p]=numeros[valorEntero];
numeros[valorEntero]=numeros[k-1];
k--;

}*/

fS.write(letra+creado);
fS.newLine();

}

fS.close();
}catch (IOException e)


Un saludo a todos y gracias
  #2 (permalink)  
Antiguo 26/01/2009, 03:02
 
Fecha de Ingreso: enero-2009
Mensajes: 26
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Numero aleatorio sin que se repita

Si no quieres elementos repetidos lo más rápido es utilizar un conjunto (HashSet o TreeSet) e ir insertando los aleatorios generados en él (en un Set no pueden existir elementos repetidos).

Puedes controlar el total de números aleatorios (distintos) generados con el tamaño del conjunto.
  #3 (permalink)  
Antiguo 26/01/2009, 03:11
 
Fecha de Ingreso: enero-2009
Mensajes: 5
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Numero aleatorio sin que se repita

Gracias por responder tan pronto v3rn0n, me pondre a buscar por internet que es un hashset y un treeset y como se usa.
Muchas gracias
  #4 (permalink)  
Antiguo 26/01/2009, 03:22
 
Fecha de Ingreso: enero-2009
Mensajes: 5
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Numero aleatorio sin que se repita

He estado buscando lo que es un hashset y no me vale, lo que hace es mostrar elementos y los que estan repetidos no mostrarlos. Lo que necesito es que genere numeros todos diferentes y los muestres.
Por ejemplo con el hashset si le digo que genere 20 numeros y repita 4 solo mostrara 16, y lo que necesito es que genere 20, todos diferentes y los muestre todos.
Hasta ahora tengo todo menos lo de que no se repitan
  #5 (permalink)  
Antiguo 26/01/2009, 03:47
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Numero aleatorio sin que se repita

Creas una Collection, metes los X numeros dentro, usas Collections.shuffle y luego los vas sacando uno a uno con un iterator.

S!

La verdad, esta ahí fuera... en el API
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #6 (permalink)  
Antiguo 26/01/2009, 04:08
 
Fecha de Ingreso: enero-2009
Mensajes: 26
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Numero aleatorio sin que se repita

Prueba a cambiar la condición:

for (int i=0; i<=total; i++)
{
int valorEntero= (int)Math.floor(Math.random()*(maximo-fijo+1)+fijo);

por hashSet.size() <= total

Si vas añadiendo en el Set, no incluirá aquellos elementos que ya estén por lo que debes generar un nuevo aleatorio (si generas únicamente 20 puede que alguno esté repedido, así vuelves a intentar generar un aleatorio que no exista en el conjunto).
  #7 (permalink)  
Antiguo 26/01/2009, 06:23
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Numero aleatorio sin que se repita

No es por ser quisquilloso, pero con algo así, a medida que el numero de elementos a generar crece y el numero de elementos que se pueden repetir crece, las probabilidades de que el algoritmo se quede haciendo el tonto generando numeros repetidos un buen rato crece y crece.

La solución no es generar los numeros a sacar aleatoriamente, es tenerlos todos y sacarlos de algun sitio aleatoriamente, quitandolos una vez los has sacado.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #8 (permalink)  
Antiguo 27/01/2009, 01:34
 
Fecha de Ingreso: enero-2009
Mensajes: 5
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Numero aleatorio sin que se repita

Gracias a todos por responder y darme ideas.
En cuanto a lo que dices GreenEyed no puede darse por defecto los numeros, el programa se va a utilizar para una emisora de radio y que no repita las canciones, y como el numero de canciones por estilo varia y cada dia tienen mas y mas canciones, tienen que poder meneter el numero maximo a mano y el numero que quieren generar de cada estilo tambien a mano y por supuesto que no se repitan.
Ya bastante doloroso es escuchar a Bisbal una vez como para tenertelo que tragar 8 veces porque la aplicacion no esta bien hecha XD.
Un saludo
Y gracias a todos
  #9 (permalink)  
Antiguo 27/01/2009, 02:27
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Numero aleatorio sin que se repita

Thulkas, no has pillado la idea de GreenEyed, me parece.

Lo que propone es algo así:

Código:
// los parámetros recibidos son min, max y cant (mínimo, máximo y la cantidad que quiero de números)
1. Cojo todos los números entre min y max y los meto en, por ejemplo, un ArrayList. Todos.
2. Desordeno el ArrayList aleatoriamente. (p.ej. con Collections.shuffle(lista))
3. En el ArrayList ahora están todos los números entre min y max sin repetir y desordenados.
4. Saco los primeros cant números del ArrayList.
Con eso, te aseguras que no se repiten porque sólo está una vez cada número entre min y max, ya de partida.

Y como ves está parametrizado con el mínimo, el máximo y la cantidad de números que quieres.
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 16:28.