una - variable booleana java ejemplo
Aleatorio booleano con peso o sesgo. (8)
Necesito generar algunos booleanos al azar. Sin embargo, tengo que ser capaz de especificar la probabilidad de devolver true
. Como resultado haciendo:
private Random random = new Random();
random.nextBoolean();
no trabajará.
Una posible solución sería:
private Random random = new Random()
public boolean getRandomBoolean(float p){
return random.nextFloat() < p;
}
Me preguntaba si hay una forma mejor o más natural de hacer esto.
EDITAR: supongo que estoy preguntando si hay una clase de biblioteca que proporciona un método nextBoolean (probabilidad flotante).
Me preguntaba si hay una forma mejor o más natural de hacer esto.
El enfoque que estás usando ya está bien. * AFAIK, no hay un método estándar de Java que haga que este código sea más corto.
* Para fines no criptográficos.1) Sí, creo que su enfoque es válido y no veo otra manera más fácil.
2) Hay una biblioteca para manejar números aleatorios de diferentes distribuciones estadísticas:
http://introcs.cs.princeton.edu/java/22library/StdRandom.java.html
Ampliando la respuesta del usuario 2495765, puedes hacer una función que tome una relación de entrada (como dos valores de probabilidad: rango ver código)
public class MyRandomFuncs {
public Random rand = new Random();
boolean getBooleanAsRatio(int chance, int range) {
int c = rand.nextInt(range + 1);
return c > chance;
}
}
Dependiendo de lo que pretenda hacer, es probable que no desee inicializar Random desde su método, sino que utilice una variable de clase (como en el código anterior) y llame a nextInt () desde su función.
El objeto aleatorio ya debe ser inicializado.
public static boolean flipRandom(double probability) {
Validate.isBetween(probability, 0, 1, true);
if(probability == 0)
return false;
if(probability == 1)
return true;
if(probability == 0.5)
return random.nextBoolean();
return random.nextDouble() < probability ? true : false;
}
Esto es lo que estoy usando. Muy similar a la respuesta de FracturedRetina.
Random random = new Random();
// 20% chance
boolean true20 = (random.nextInt(5) == 0) ? true : false;
// 25% chance
boolean true25 = (random.nextInt(4) == 0) ? true : false;
// 40% chance
boolean true40 = (random.nextInt(5) < 2) ? true : false;
La biblioteca MockNeat implementa esta característica.
Ejemplo para generar un valor booleano que tiene el 99,99% de ser verdadero:
MockNeat m = MockNeat.threadLocal();
boolean almostAlwaysTrue = m.bools().probability(99.99).val();
Tu forma es probablemente mejor, codifica el código de golf, pero otra forma de hacerlo es así:
public boolean getRandomBoolean() {
Random random = new Random();
//For 1 in 5
int chanceOfTrue = 5;
if (random.nextInt(chanceOfTrue) == 0) {
return true;
} else {
return false;
}
}
O para 2 en 5, prueba esto:
public boolean getRandomBoolean() {
Random random = new Random();
//For 2 in 5
int chanceOfTrue = 5;
int randInt = random.nextInt(chanceOfTrue);
if (randInt == 0 || randInt == 1) {
return true;
} else {
return false;
}
}
public boolean getBiasedRandom(int bias) {
int c;
Random t = new Random();
// random integers in [0, 100]
c=t.nextInt(100);
if (c>bias){return false;
}
else{return true;}
}
Este se basa en porcentaje ...