web-dev-qa-db-fra.com

Générer une probabilité booléenne aléatoire

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.

24
Dark Side

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;
38
E. Moffat

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)
17
Peter O.

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
9
Hamid Pourjam

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:

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

7
Mike

Je pense que cela peut vous aider 

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

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;
}
0
AssassinLV