ランダムなブール値(true/false)を生成する方法を知っているだけです。デフォルトの確率は50:50です
しかし、どうすれば自分の確率で真の偽の値を生成できますか? 40:60または20:80などの確率でtrueを返すとしましょう...
1つの方法はRandom.Next(100) <= 20 ? true : false
です。NextIntの整数値を使用して、独自の確率を強制します。ただし、この方法の真の「ランダム性」とは言えません。
より詳細な例:
Random gen = new Random();
int prob = gen.Next(100);
return prob <= 20;
最大100個の排他的な乱数を生成し、それが特定のパーセント未満かどうかを確認します。例:
if(random.Next(100) < 40) {
// will be true 40% of the time
}
より一般的には、X/Yの確率のために、次のようなイディオムを使用します。
if(random.Next(Y) < X)
これは、指定された確率(パーセンテージ)がtrueであるランダムboolを提供する拡張メソッドです。
public static bool NextBool(this Random r, int truePercentage = 50)
{
return r.NextDouble() < truePercentage / 100.0;
}
あなたはこれを次のように使うことができます
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
あなたの確率が0.0と1.0の間のdouble
として表されると仮定すると、私はそれをより簡単に次のように実装します:
Random Rand = new Random();
...
double trueProbability = 0.2;
bool result = Rand.NextDouble() < trueProbability;
result
は、true
で与えられる確率を持つtrueProbability
になります
http://msdn.Microsoft.com/en-us/library/system.random.nextdouble(v = vs.110).aspx
これが「十分にランダム"、RNGCryptoServiceProvider
を見ることができます:
役立つと思います
Random gen = new Random();
bool result = gen.Next(100) < 50 ? true : false;
今後の知識:
40:60は次のようになります。
var random = new Random();
return random.Next(10) < 4;
20:80は次のようになります。
var random = new Random();
return random.Next(5) == 0
そして1:1は次のようになります:
var random = new Random();
return random.Next(2) == 1;
注:最短のバリエーションに確率を短くするだけです。たとえば、「random.Next(5)== 0」は「random.Next(100)<= 20」よりも速いです-確率がユーザー入力から変化する場合-次のようになります。
[ModifierByChoice] bool GetProbability(int trueProbability, int falseProbability)
{
var random = new Random();
return random.Next(trueProbability, trueProbability + falseProbability) < trueProbability;
}