Generar probabilidad booleana aleatoria

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 …

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; 

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) 

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 

Suponiendo que su probabilidad se represente como el double entre 0.0 y 1.0, lo implementaría más simplemente así:

 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 ", puede echar un vistazo a RNGCryptoServiceProvider :

http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider(v=vs.110).aspx

Creo que te puede ayudar

 Random gen = new Random(); bool result = gen.Next(100) < 50 ? true : false; 

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: Solo 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 de 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; } 
 Random gen = new Random(); var boolVal = gen.Next(0, 1)==1? true : false;