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

Números aleatorio no uniformes

Estas en el tema de Números aleatorio no uniformes en el foro de Java en Foros del Web. Hola!, estoy haciendo un programa que me genere números aleatorios simulando tiradas de dados entre otras muchas cosas. Las tiradas pueden ser múltiples, es decir, ...
  #1 (permalink)  
Antiguo 08/01/2011, 12:42
 
Fecha de Ingreso: enero-2010
Mensajes: 5
Antigüedad: 14 años, 10 meses
Puntos: 0
Pregunta Números aleatorio no uniformes

Hola!, estoy haciendo un programa que me genere números aleatorios simulando tiradas de dados entre otras muchas cosas.

Las tiradas pueden ser múltiples, es decir, puedo querer el resultado aleatorio de lanzar 20 dados de 20 caras por ejemplo, con lo que tengo un nº de dados y un nº de caras donde el mínimo sería el nº de dados y el máximo el nº de dados * el nº de caras, es decir, utilizando el ejemplo anterior de 20 dados de 20 caras sería un número entre 20 y 400.

En un principio me plantee "resolver el problema" generando simplemente un nº entre 20 y 400 del siguiente modo:

Código:
resultado=(int)(aleatorio.nextDouble() * (máximo*mínimo -mínimo+1) +mínimo );
txtResultado.setText(Integer.toString(resultado));
hasta aquí todo perfecto (seguiré usando el ejemplo de antes de los 20 dados y las 20 caras para explicarme), me salían números perfectamente acotados y aleatorios (como era de esperar) sacando algún 20 o 23 y un 360 y algún 400,... todo perfecto.

El problema me ha surgido cuando se me ha hecho necesario ver también el desglose de las tiradas, es decir, me es necesario también saber cuales han sido los valores de esas 20 tiradas, por lo que modifiqué el código con un simple for para que me sacase un nº aleatorio entre 1 y el nº de caras durante nº de dados iteraciones, los sumaba en resultado y añadía la tirada individual a un textbox para ver el desglose, lo hago del siguiente modo:

Código:
for(int i=0;i<(mínimo);i++){
            tirada = (int)(aleatorio.nextDouble() * (máximo) +1 );
            resultado+=tirada;
            txtDesglose.setText(txtDesglose.getText() + "   "+ Integer.toString(tirada));
        }
txtResultado.setText(Integer.toString(resultado));
Y en un principio todo iba bien, veía las tiradas, todas dentro del rango y sumar lo sumaba correctamente, no obstante al hacer pruebas y más prubas (hasta el punto de crearme un text llamado test para hacer 10000 iteraciones y ver los resultados) los valores de 20 dados de 20 caras (de 20 a 400 debiera ser) no han bajado NUNCA de 100 y tampoco me han dado un valor superior a 300, por lo que a efectos prácticos me ha calculado un promedio aleatorio, lo que obviamente no estoy buscando.

Investigando un poco me he enterado de que la clase random asegura la uniformidad de las tiradas aleatorias con lo que si hago 10000 iteraciones sacando nºs aleatorios entre 0 y 9 me saldrían cada uno nº cercano a 1000 veces, es decir, el aleatorio esta uniforme y equitativo, lo cual está muy bien, pero en este caso me desvirtúa la posibilidad de llegar a las cotas mínimas y máximas de las tiradas.

Mi pregunta caballeros es si existe algún modo de anular dicha uniformidad para que la posibilidad de sacar "1" en todas las tiradas (ya sean 3, 10, 20 o 400) sea plausible o cuanto menos "posible".

GRACIAS de antemano.

.-Salu2-.
  #2 (permalink)  
Antiguo 08/01/2011, 13:47
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: Números aleatorio no uniformes

Cita:
Investigando un poco me he enterado de que la clase random asegura la uniformidad de las tiradas aleatorias con lo que si hago 10000 iteraciones sacando nºs aleatorios entre 0 y 9 me saldrían cada uno nº cercano a 1000 veces, es decir, el aleatorio esta uniforme y equitativo, lo cual está muy bien, pero en este caso me desvirtúa la posibilidad de llegar a las cotas mínimas y máximas de las tiradas.
No sé de dónde habrás sacado esas conclusiones, pero creo que son erróneas.

Random tiene limitaciones (conseguir una auténtica alatoriedad es difícil), pero la que nombras no es cierta, no reparte los posibles resultados equitativamente.

Tu pega de que de 10000 tiradas, tenderá a salir 1000 veces cada número del 0 al 9, tiene una explicación, eso es simplemente probabilidad en estado puro, es la demostración de la aleatoriedad.

http://es.wikipedia.org/wiki/Ley_de_...#37;C3%BAmeros

Por si quieres comprobarlo empíricamente

http://docentes.educacion.navarra.es...guras/dado.htm

La probabilidad de que te salga todo 1 en 20 tiradas es de 1 entre 6^20, así que no esperes verla haciendo iteraciones.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.

Etiquetas: sumatorio, uniformidad, 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 13:22.