web-dev-qa-db-ja.com

ランダムブール確率の生成

ランダムなブール値(true/false)を生成する方法を知っているだけです。デフォルトの確率は50:50です

しかし、どうすれば自分の確率で真の偽の値を生成できますか? 40:60または20:80などの確率でtrueを返すとしましょう...

25
Dark Side

1つの方法はRandom.Next(100) <= 20 ? true : falseです。NextIntの整数値を使用して、独自の確率を強制します。ただし、この方法の真の「ランダム性」とは言えません。

より詳細な例:

Random gen = new Random();
int prob = gen.Next(100);
return prob <= 20;
43
E. Moffat

最大100個の排他的な乱数を生成し、それが特定のパーセント未満かどうかを確認します。例:

if(random.Next(100) < 40) {
  // will be true 40% of the time
}

より一般的には、X/Yの確率のために、次のようなイディオムを使用します。

if(random.Next(Y) < X)
17
Peter O.

これは、指定された確率(パーセンテージ)が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
10
Hamid Pourjam

あなたの確率が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を見ることができます:

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

8
Mike

役立つと思います

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

今後の知識:

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