2012-04-09 31 views
7

私はこの質問をいくつかの方法で聞いたことがありますが、ここでやっていることの健全性チェックが必要です。c#確率と乱数

基本的に私が使用して1と100の間で発生した乱数に基づいて、25%の確率でイベントをトリガしたい:

int rand = random.Next(1,100); 

次はこれを実現するのだろうか?

私は1から100までの数字を使用すると思ったので、後で確率を微調整することができます。を使用して23%に調整する

if (rand<=23) {...} 

ありがとうございます。

+1

試しましたか?それは正常に動作するはずです。短時間のウィンドウで多くの「ランダム」インスタンスを再作成しないように注意するか、同じ「ランダム」な結果を返すだけです。 – mellamokb

+0

必要に応じて後で微調整したいので、1から4を使用したくないですが、はい、1,4は同じです。ありがとうScott、私はそれを逃した。 – CdrTomalak

+0

それは右のように聞こえる。 –

答えて

5

Next(int, int)の第2引数は、結果の望ましい範囲のexclusive upper boundです。そのため、これを使用する必要があります。

if (random.Next(0, 100) < 25) 

か、あなたは1ベースのロジックを使用する必要がある場合は、

if (random.Next(1, 101) <= 25) 
+0

これは面白いことですが、私は、if((rand> 25)&&(rand <= 50)){...}を使って同じ乱数を使って別の25%チャンスイベントを試してみることができます。しかし、私はちょうど同様にうまくいくと示唆しているように一連のif文を持っていると思いますか? – CdrTomalak

+0

@CdrTomalakはまったく動作しません。あなたの最初のイベント*が呼び出された場合、次のイベントを呼び出す確率はゼロです。最初のイベントが呼び出されなかった場合、次のイベントを呼び出す確率は1/3です。乱数を再利用すると、イベントは独立してランダムになることはなくなります。両方の出来事が起こることはありません。一方、4つのイベントのうちの1つをランダムに選択したい場合は、正しいトラックにいるとします。 – phoog

+0

@CdrTomalak下限がインクルーシブで上限がインクルーシブなので、ゼロベースの数値に 'if(rand> = 25 && rand <50)'を使う必要があります。 1から始まる数字の場合、式は正しいでしょう。 – phoog

8

をあなたが作っている最大の誤りは、それがrandom.Next(0,100)

documentation statesようであるべきです

minValue:返される乱数の下限を含む。

maxValue:排他的の返された乱数の上限。 maxValueはminValue以上でなければなりません。

Emphisis鉱山は、排他的には、それはあなたが渡された番号が含まれないことを意味するので、私のコードは、0〜99の範囲を生成し、あなたのコードは、範囲1〜99を生成します。

だからあなたのコードが

int rand = random.Next(0,100) 

if (rand < 25) //25% 
{ 
    // Some event... 
} 

//other code 
if (rand < 23) //23% 
{ 
    // Some event... 
} 

<から<=からの変更を変更するには、今排他的な上限を使用しているされているため、あなたはまた、二重の間の通常の割合の計算のために(このコードを使用することができます

5

の範囲0と1を使用):

double rand = random.NextDouble(); 
if(rand < .25) 
{ 
... 
+0

これは 'if(rand <.25)'でなければなりません。上限は排他的です。http://msdn.microsoft.com/en-us/library/system.random.nextdouble.aspx – phoog

+0

ありがとうございます。あなたが気にしないなら私の答えを編集しました。しかし、2倍の場合はそれほど大きな違いはありません。 (違いは、0.249999999 ...と0.25のような数字が出現し、1/4の確率の画像を損なうことはありません) –

+0

はい、その差は非常に小さいです。正確な影響は、NextDouble関数もちろん、戻ることができます)。私は、このアルゴリズムが非常に敏感で違いがあるとしたら、最初は擬似乱数ではなく真の乱数を使用するべきだと思います。 – phoog