c# - usar - Generar probabilidad booleana aleatoria
propiedad random c# (7)
Solo sé cómo puedo generar un valor booleano aleatorio (verdadero / falso). La probabilidad por defecto es 50:50.
Pero, ¿cómo puedo generar un verdadero valor falso con mi propia probabilidad? Digamos que devuelve true con una probabilidad de 40:60 o 20:80 etc ...
Aquí hay un método de extensión que proporcionará un valor aleatorio con una probabilidad específica (en porcentaje) de ser verdadero;
public static bool NextBool(this Random r, int truePercentage = 50)
{
return r.NextDouble() < truePercentage / 100.0;
}
puedes usar esto como
Random r = new Random();
r.NextBool(); // returns true or false with equal probability
r.NextBool(20); // 20% chance to be true;
r.NextBool(100); // always return true
r.NextBool(0); // always return false
Creo que te puede ayudar
Random gen = new Random();
bool result = gen.Next(100) < 50 ? true : false;
Genera un número aleatorio de hasta 100 exclusivos y ve si es menor que un porcentaje dado. Ejemplo:
if(random.Next(100) < 40) {
// will be true 40% of the time
}
Más generalmente, para una probabilidad de X / Y, use un modismo como:
if(random.Next(Y) < X)
Para futuros conocimientos:
40:60 sería:
var random = new Random();
return random.Next(10) < 4;
20:80 sería:
var random = new Random();
return random.Next(5) == 0
y 1: 1 sería:
var random = new Random();
return random.Next(2) == 1;
Nota: Simplemente acorte la probabilidad a la variante más corta, como por ejemplo: "random.Next (5) == 0" es más rápido que "random.Next (100) <= 20 Aunque - si la probabilidad cambia con respecto a la entrada del usuario - entonces se vería como:
[ModifierByChoice] bool GetProbability(int trueProbability, int falseProbability)
{
var random = new Random();
return random.Next(trueProbability, trueProbability + falseProbability) < trueProbability;
}
Suponiendo que su probabilidad se represente como el double
entre 0.0 y 1.0, lo implementaría más simplemente de esta manera:
Random rand = new Random();
...
double trueProbability = 0.2;
bool result = rand.NextDouble() < trueProbability;
result
será true
con la probabilidad dada por trueProbability
http://msdn.microsoft.com/en-us/library/system.random.nextdouble(v=vs.110).aspx
Si esto no es "lo suficientemente aleatorio ", puedes echar un vistazo a RNGCryptoServiceProvider
:
Bueno, una forma es Random.Next(100) <= 20 ? true : false
Random.Next(100) <= 20 ? true : false
, usando el valor entero de NextInt para forzar su propia probabilidad. Sin embargo, no puedo hablar de la verdadera "aleatoriedad" de este método.
Ejemplo más detallado:
Random gen = new Random();
int prob = gen.Next(100);
return prob <= 20;
Random gen = new Random();
var boolVal = gen.Next(0, 1)==1? true : false;