Je sais seulement comment générer une valeur booléenne aléatoire (vrai/faux) . La probabilité par défaut est de 50:50.
Mais comment puis-je générer une vraie valeur fausse avec ma propre probabilité? Supposons qu’elle retourne vrai avec une probabilité de 40:60 ou 20:80, etc.
Eh bien, un moyen est Random.Next(100) <= 20 ? true : false
, en utilisant la valeur entière de NextInt pour forcer votre propre probabilité. Je ne peux cependant pas parler du véritable «caractère aléatoire» de cette méthode.
Exemple plus détaillé:
Random gen = new Random();
int prob = gen.Next(100);
return prob <= 20;
Vous générez un nombre aléatoire allant jusqu'à 100 exclusifs et vous voyez si c'est inférieur à un pourcentage donné. 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 tel que:
if(random.Next(Y) < X)
Voici une méthode d'extension qui fournira une valeur aléatoire avec une probabilité spécifiée (en pourcentage) d'être vraie;
public static bool NextBool(this Random r, int truePercentage = 50)
{
return r.NextDouble() < truePercentage / 100.0;
}
vous pouvez utiliser ceci 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é soit représentée sous la forme double
comprise entre 0.0 et 1.0, je la mettrais en œuvre 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 "assez aléatoire", vous pouvez jeter un oeil à RNGCryptoServiceProvider
:
Je pense que cela peut vous aider
Random gen = new Random();
bool result = gen.Next(100) < 50 ? true : false;
Pour la connaissance future:
40:60 serait:
var random = new Random();
return random.Next(10) < 4;
20h80 serait:
var random = new Random();
return random.Next(5) == 0
et 1: 1 serait:
var random = new Random();
return random.Next(2) == 1;
Remarque: Réduisez simplement la probabilité à la variante la plus courte - comme par exemple: "random.Next (5) == 0" est plus rapide que "random.Next (100) <= 20 Bien que - si la probabilité change du entrée utilisateur - alors cela ressemblerait à:
[ModifierByChoice] bool GetProbability(int trueProbability, int falseProbability)
{
var random = new Random();
return random.Next(trueProbability, trueProbability + falseProbability) < trueProbability;
}