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

entero aleatorio distribucion uniforme

Estas en el tema de entero aleatorio distribucion uniforme en el foro de Java en Foros del Web. Consigo crear una secuencia de 5 numeros aleatorios,pero puede darse el caso que se repitan. Lo que quiero es una secuencia aleatoria de 5 numeros ...
  #1 (permalink)  
Antiguo 01/09/2010, 14:25
 
Fecha de Ingreso: mayo-2009
Mensajes: 69
Antigüedad: 14 años, 10 meses
Puntos: 0
entero aleatorio distribucion uniforme

Consigo crear una secuencia de 5 numeros aleatorios,pero puede darse el caso que se repitan.

Lo que quiero es una secuencia aleatoria de 5 numeros entre el [1 y 5] pero que no se repitan.

Código PHP:
/** Devuelve un valor entero aleatorio en el intervalo [a,b]
   *  con distribución uniforme.
   */
   
public static int aleatorio(int aint b) {
    
// Devuelve un número aleatorio entre a y b.
    
int numaleatorio = (int) (Math.random()*(a-b))+b;
    return 
numaleatorio;
  }
//Fin de aleatorio 
Código PHP:
  /** Devuelve un array de enteros con una permutación aleatoria
   * (distribución uniforme) de los valores 1,2,3,...,cant.
   */
  
public static int[] generaArrayAleatorio(int cant) { //int cant=5
      
int array[]=new int[cant];
      for (
int i=0;i<array.length;i++) {
        array[
i]=aleatorio(5,1);
      }
      return array;
  }
//Fin de generaArrayAleatorio 
  #2 (permalink)  
Antiguo 02/09/2010, 00:29
 
Fecha de Ingreso: julio-2010
Mensajes: 104
Antigüedad: 13 años, 9 meses
Puntos: 2
Respuesta: entero aleatorio distribucion uniforme

Buenos días,

Compara el número que obtengas con los ya existentes en el array y todo con buen IF.

Un saludo.
  #3 (permalink)  
Antiguo 02/09/2010, 15:57
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: entero aleatorio distribucion uniforme

Hay un algoritmo muy eficiente para eso.

Código Javascript:
Ver original
  1. int a[] = {1,2,3,4,5}
  2. int ind;
  3. int aux;
  4. Random r = new Random();
  5.  
  6. for (int i=4;i>-1;i--){
  7.  
  8. ind = r.nextInt(i+1);
  9.  
  10. aux = a[i];
  11. a[i] = a[ind];
  12. a[ind] = aux;
  13.  
  14. System.out.println(a[i]);
  15.  
  16. }

Por si no se ve claro (o lo he escrito mal), se trata de elegir una posición aleatoria x entre n valores, intercambiar valores entre x y n, repetir aleatorio con n-1 valores intercambiando x y n-1, y así sucesivamente.
  #4 (permalink)  
Antiguo 06/09/2010, 04:10
Avatar de genuine_carlosV2  
Fecha de Ingreso: noviembre-2008
Ubicación: 127.0.0.1
Mensajes: 296
Antigüedad: 15 años, 5 meses
Puntos: 6
Respuesta: entero aleatorio distribucion uniforme

Lo que tu pides no es una distribución uniforme.
Una distribución uniforme es una distribución de valores donde cada valor tiene la misma probabilidad para salir que los otros (lo cual no significa que no pueda salir repetido, eso ya depende de la "aleatoriedad").

En Java puedes hacer distribuciones uniformes con un SecureRandom en vez de un Random a secas.

Para lo que tu pides, crea un array y, antes de añadir cada valor, verifica que no exista en dicho array. Si buscas por la API de Java, me parece que hay listas y/o arrays capaces de verificar que exista o no un objeto en concreto y almacenarlo o no en función de lo anterior.

El algoritmo de Xerelo es muy bueno si quieres ordenar de forma aleatoria un conjunto de número pero tiene el problema de que ya los tienes que tener seleccionados de modo que no los puedes escoger de forma aleatoria.

Saludos
__________________
Carlos

Recoger datos es solo el primer paso hacia la sabiduría. Pero compartir información es el primer paso hacia la comunidad. - IBM
  #5 (permalink)  
Antiguo 06/09/2010, 12:26
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: entero aleatorio distribucion uniforme

genuine_carlosV2, no he entendido muy bien lo que quieres decir con que ya los tienes que tener seleccionados.

Ese algoritmo, no es para ordenar números, el tema de la ordenación es simplemente parte del algoritmo, si te fijas, en cada bucle puedes obtener un valor aleatorio. Si te interesase sólo obtener un valor cuando lo llames (sin obtener los 5 seguidos) tendrías que crear un array y un contador estático sin bucle, y en el caso de usar una lista, también tendrías que usar una lista estática.

El problema de usar el método contains() de listas, es que cada vez que vaya a buscar un número, hace una comprobación de cada elemento desde el primero hasta que llegue al duplicado (volviendo a repetir el proceso con un nuevo número aleatorio) o al final, y eso cada vez que quieras obtener un nuevo número. Ahora imagina que ya tienes 4 valores de los cinco posibles, la probabilidad dice que de cada cinco intentos que hagas, sólo uno te devolverá el número que te falta.

Evidentemente, para 5 números no lo notas, pero si estamos hablando de grandes números, el retardo es más que apreciable.
  #6 (permalink)  
Antiguo 07/09/2010, 11:37
Avatar de genuine_carlosV2  
Fecha de Ingreso: noviembre-2008
Ubicación: 127.0.0.1
Mensajes: 296
Antigüedad: 15 años, 5 meses
Puntos: 6
Respuesta: entero aleatorio distribucion uniforme

Xerelo, lo que quería decir es que el algoritmo que propones no sirve si lo que quieres es rellenar el vector a. Efectivamente se escogen numeros aleatorios pero son para establecer el orden del vector, no el contenido.

Dije lo que dije porque no me di cuenta que okawa quería tener los números del 1 al 5. Si lo que hubiese querido eran 5 numeros escogidos del 1 al 10 sin repetir, tu algoritmo no le sirve.

Efectivamente, buscar en un array una y otra vez es muy ineficiente, por eso hay otras alternativas para una mayor cantidad de números. Para este ejemplo o el que escribí antes, son válidos. Sin embargo, indiscutiblemente, para este problema, la mejor solución es la tuya pero repito que sólo sive si quieres escoger X números aleatorios de entre Y posibilidades sin repetir (siendo X=Y).

Saludos
__________________
Carlos

Recoger datos es solo el primer paso hacia la sabiduría. Pero compartir información es el primer paso hacia la comunidad. - IBM
  #7 (permalink)  
Antiguo 07/09/2010, 12:44
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: entero aleatorio distribucion uniforme

De los métodos más eficientes usando el API:

http://lospuntossobrelasjotas.blogsp...ar-o-rtfa.html

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.

Etiquetas: entero, 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 01:20.