2011-11-18 67 views
28

Tenía curiosidad por saber, ¿cómo implemento la probabilidad en Java? Por ejemplo, si las posibilidades de que una variable se muestre son 1/25, ¿cómo implementaría eso? O cualquier otra probabilidad? Por favor, apúntame en la dirección general.Probabilidad en Java

+3

echa un vistazo a java Clase aleatoria. Eso le permite generar un número aleatorio, y puede ir desde allí ... –

Respuesta

53

Utilizaría Random para generar un número aleatorio, luego compárelo con un literal para que coincida con la probabilidad que está tratando de lograr.

Así dado:

boolean val = new Random().nextInt(25)==0; 

val tendrá una probabilidad 1/25 de ser verdadero (desde nextInt() tiene una probabilidad incluso de devolver cualquier número a partir de 0 y hasta, pero no incluyendo, 25.)

Por supuesto, también debe tener import java.util.Random;.

Como se señala más adelante, si usted está recibiendo más de un número aleatorio que sería más eficiente para reutilizar el objeto aleatorio en lugar de volver a crearlo todo el tiempo:

Random rand = new Random(); 
boolean val = rand.nextInt(25)==0; 

..

boolean val2 = rand.nextInt(25)==0; 
+1

¡gran lógica! ¡Gracias! –

+1

+1: Colocando 'new Random()' en un campo o variable y reutilizándolo ayudaría a la eficiencia. –

+0

@PeterLawrey tiene razón, por supuesto, he editado la respuesta de manera apropiada. ¡Simplemente lo puse de esa manera como un ejemplo de 1 línea! – berry120

25

Generalmente utiliza un generador de números aleatorios. La mayoría de ellos devuelve un número en el intervalo [0,1] por lo que luego se verifica si ese número es < = 0.04 o no.

if(new Random().nextDouble() <= 0.04) { //you might want to cache the Random instance 
    //we hit the 1/25 (4%) case. 
} 

O

if(Math.random() <= 0.04) { 
    //we hit the 1/25 (4%) case. 
} 

Tenga en cuenta que hay múltiples generadores de números aleatorios que tienen propiedades diferentes, pero para aplicaciones simples de la clase Random deberían ser suficientes.

+0

En el caso general, esta solución que utiliza rand.nextDouble() es mejor que la respuesta aceptada, ya que puede aplicarse a cualquier probabilidad arbitraria (en lugar de solo a 1/x para un entero dado x). Por ejemplo, si su probabilidad de destino es 33.5%, no hay una solución simple y limpia usando rand.nextInt(). – shiri

+1

@shiri que depende debido a posibles problemas de precisión. Usando números enteros puedes crear un número entero entre 0 y 1000 y verificar que el valor esté por debajo de 335. – Thomas

+1

de acuerdo, supongo que se trata de una cuestión de preferencia. Cuando pienso en las probabilidades, tiendo a pensar en términos de números en el rango de [0,1], por lo que me parece que nextDouble() <= X es más limpio. – shiri

5

Java tiene una clase llamada java.util.Random que puede generar números aleatorios. Si quieres que algo suceda con probabilidad 1/25, sólo tiene que generar un número aleatorio entre 1 y 25 (o 0 y 24 inclusive) y comprobar si ese número es igual a 1.

if(new java.util.Random().nextInt(25)==0){ 
    //Do something. 
} 
2

Tal vez se puede implementar esta con generación de números aleatorios.

Random rn = new Random(); 
    double d = rn.nextDouble();  // random value in range 0.0 - 1.0 
    if(d<=0.04){ 
    doSomeThing(); 
    } 
6

Desde 1.7 Es mejor utilizar (en el entorno concurrente al menos):

ThreadLocalRandom.current().nextInt(25) == 0 

Javadoc

Un generador de números aleatorios aislado a la rosca actual. Al igual que el generador aleatorio global utilizado por la clase matemática, un ThreadLocalRandom se inicializa con una semilla generada internamente que de lo contrario no se puede modificar. Cuando corresponda, el uso de ThreadLocalRandom en lugar de los objetos aleatorios compartidos en programas concurrentes generalmente encontrará mucha menos carga y contención. El uso de ThreadLocalRandom es particularmente apropiado cuando varias tareas (por ejemplo, cada una ForkJoinTask) usan números aleatorios en paralelo en grupos de hilos. Los usos de esta clase normalmente deben tener la forma: ThreadLocalRandom.current(). NextX (...) (donde X es Int, Long, etc.). Cuando todos los usos son de esta forma, nunca es posible compartir accidentalmente un ThreadLocalRandom en varios hilos.

Esta clase también proporciona métodos adicionales de generación aleatoria limitada usados ​​comúnmente.

Cuestiones relacionadas