Générer Une Probabilité Booléenne Aléatoire
je sais seulement comment je peux générer une valeur booléenne aléatoire (true / false). La probabilité par défaut est de 50: 50
mais comment puis-je générer une vraie fausse valeur avec ma propre probabilité? Disons qu'il retourne vrai, avec une probabilité de 40:60 ou 20:80 etc...
7 réponses
eh Bien, une façon est Random.Next(100) <= 20 ? true : false
, en utilisant la valeur entière de NextInt pour forcer votre propre probabilité. Je ne peux pas parler du vrai "hasard" de cette méthode cependant.
exemple Plus détaillé:
Random gen = new Random();
int prob = gen.Next(100);
return prob <= 20;
Vous générer un nombre aléatoire jusqu'à 100 exclusif et voir si c'est moins de un pour cent. Exemple:
if(random.Next(100) < 40) {
// will be true 40% of the time
}
plus généralement, pour une probabilité de X/Y, utilisez un idiome comme:
if(random.Next(Y) < X)
Voici une méthode d'extension qui fournira un bool aléatoire avec une probabilité spécifiée (en pourcentage) d'être vrai;
public static bool NextBool(this Random r, int truePercentage = 50)
{
return r.NextDouble() < truePercentage / 100.0;
}
vous pouvez l'utiliser comme
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
en Supposant que votre probabilité est représentée par double
entre 0.0 et 1.0, Je l'implémenterais plus simplement comme ceci:
Random rand = new Random();
...
double trueProbability = 0.2;
bool result = rand.NextDouble() < trueProbability;
result
sera true
avec la probabilité donnée par trueProbability
http://msdn.microsoft.com/en-us/library/system.random.nextdouble(v=vs. 110).aspx
Si ce n'est pas "suffisamment aléatoire", vous pouvez prendre un coup d'oeil à RNGCryptoServiceProvider
:
je pense qu'il peut aider à vous
Random gen = new Random();
bool result = gen.Next(100) < 50 ? true : false;
Pour l'avenir de la connaissance:
40:60:
var random = new Random();
return random.Next(10) < 4;
20:80 serait:
var random = new Random();
return random.Next(5) == 0
et 1:1 serait:
var random = new Random();
return random.Next(2) == 1;
Note: il suffit de raccourcir la probabilité à la variante la plus courte - comme par exemple: "aléatoire.Next (5) == 0" est plus rapide que "aléatoire.Suivant (100) < = 20 Cependant-si la probabilité change à partir de l'entrée de l'utilisateur-alors il semblerait que:
[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;