Ver Mensaje Individual
  #1 (permalink)  
Antiguo 08/01/2011, 12:42
frikinside
 
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-.