2016-06-16 7 views
9

C#コードでパーセントチャンスのヘルプが必要です。私は1から100までのループを持っているとしましょう、そのループで私は70%の時間(ランダムに)実行される "if"コードを持っているとしましょう。どのように私はそれを達成するだろうか?したがって、このような何か:コードは70%の確率でヒットさせる場合C#で "%chance"を実装する

static void Main(string[] args) 
{ 
    var clickPercentage = 70; 

    for (int i = 0; i < 100; i++) 
    { 
     if (chance) 
     { 
      //do 70% times 
     } 
    } 
} 

だから、トップ例えば私は約70倍の私例えば、したいと思います。私が試した

もの:(どこにも70%近く、より1〜2%の確率のような)

static void Main(string[] args) 
{ 
    var clickPercentage = 70; 

    for (int i = 0; i < 100; i++) 
    { 
     var a = GetRadnomNumber(1, clickPercentage); 
     var b = GetRadnomNumber(1, 101); 

     if (a <= b) 
     { 
      Console.WriteLine($"Iteracija {i} - {b} <= {a}"); 
     } 
    } 
} 

public static int GetRadnomNumber(int min, int max) 
{ 
    var random = new Random(); 
    var retVal = random.Next(min, max); 

    return retVal; 
} 
+1

ボーダーラインデュープを。あなたは***本当に***これを読む必要があります:http://stackoverflow.com/questions/767999/random-number-generator-only-generating-one-random-number – spender

+1

あなたのメソッドを 'GetRadnomNumber'から変更することをお勧めします'GetRandomNumber'へ –

答えて

7

Random classを使用してください。

あなたは0と99の間のランダムなintを取得するためにRandom.Next(100)を使用することができます。それはデフォルトコンストラクタは、現在の時刻を使用しているため

public static Random RandomGen = new Random(); 
..... 

int clickPercentage = 70; 
for (int i = 0; i < 100; i++) 
{ 
    int randomValueBetween0And99 = RandomGen.Next(100); 
    if (randomValueBetween0And99 < clickPercentage) 
    { 
     //do 70% times 
    } 
} 

それはあなたがループにランダムなインスタンスを作成しないことが重要ですシード。ループ内で値が繰り返される可能性があります。だからこそ私はstaticフィールドを使用しています。 Randomインスタンスをメソッドに渡して、呼び出し元がライフタイムとシードを確実に処理できるようにすることもできます。同じシードを使用することが重要な場合があります。たとえば、同じテストを繰り返すことがあります。

2

あなたのロジックはあまり確かではありませんが、ループの中にランダムなオブジェクトを作成しています。

この問題は、Randomクラスが現在の時刻をシードとして使用していることが原因です。シードが同じ場合、Randomクラスは同じ乱数シーケンスを生成します。最近のCPUの速度が非常に速いため、通常は複数のループ反復で同じシードが発生するため、乱数ジェネレータの出力は完全に予測できます(以前のものと同じです)。基本的にはあなたが新しいRandom -instanceを必要とするすべての反復をドント、一度だけRandomクラスのインスタンスを作成し、あなたのコードでそれを再利用し、

private static readonly Random _rnd = new Random(); 
// use _rnd in you code and don't create any other new Random() instances 
+0

ランダムインスタンスについて読んでいましたが、私は同じ"ランダム "の数字をたくさん持っていて、それが問題であることを認識していませんでした。 –

0

のようなものを、これを回避するために

。これを簡単に使用してください:

var r = new Random(); 

for(int i = 0; i < 100; i++) 
{ 
    var p = r.Next(100); 
    if (p >= 1 - myThreshhold) // do anything in 70% of cases 
} 

また、if (p <= myThreshold)を使用することもできます。

2

関数としてのまとめ:

private static Random generator = null; 

/* 
* Calls onSuccess() chanceOfSuccess% of the time, otherwise calls onFailure() 
*/ 
public void SplitAtRandom(int chanceOfSuccess, Action onSuccess, Action onFailure) 
{ 
    // Seed 
    if (generator == null) 
     generator = new Random(DateTime.Now.Millisecond); 

    // By chance 
    if (generator.Next(100) < chanceOfSuccess) 
    { 
     if (onSuccess != null) 
      onSuccess(); 
    } 
    else 
    { 
     if (onFailure != null) 
      onFailure(); 
    } 
} 

をし、それを使用する:

for (int i = 0; i < 100; i++) 
{ 
    SplitAtRandom(70, 
       () => { /* 70% of the time */ }, 
       () => { /* 30% of the time */ }); 
} 
関連する問題