2008-09-04 21 views

答えて

60

私はEricの回答に追加する唯一のことは説明です;なぜコードが動作するのかの知識は、どのコードが動作するのかを知るよりも優れています。

説明は次のとおりです。2.5から4.5までの数値を指定したいとしましょう。範囲は2.0(4.5 - 2.5)です。 NextDoubleは0と1.0の間の数値のみを返しますが、これを範囲に掛け合わせると、0との範囲の間の数値が得られます。 2.5と4.5の間でそれらを

rng.NextDouble() * 2.0

をしかし、我々はしたい:

だから、これは0.0と2.0の間で私たちにランダムダブルスを与えるだろう!これをどうやってやるの?最小の数値を追加する2.5:

2.5 + rng.NextDouble() * 2.0

ここで、0.0から2.0の間の数値を取得します。これらの値のそれぞれに2.5を追加すると、その範囲は現在2.5と4.5の間にあることがわかります。

最初は私はb> aまたはa> bのいずれかであると思っていましたが、両方の方法でそれを実行すると、変数の順序を崩さない限り、中古。私は私が混入しないように長い変数名でそれを表現したい:

double NextDouble(Random rng, double min, double max) 
{ 
    return min + (rng.NextDouble() * (max - min)); 
}
2
// generate a random number starting with 5 and less than 15 
Random r = new Random(); 
int num = r.Next(5, 15); 

あなたはNextDouble

+1

実際には正確ではありません。 NextDoubleは0.0と1.0の間でのみ生成します。 – Bloodyaugust

+3

NextDouble()は、私が見ることのできる引数をとりません。 –

20
System.Random r = new System.Random(); 

double rnd(double a, double b) 
{ 
    return a + r.NextDouble()*(b-a); 
} 
1

で次を置き換えることができますか?あなたは、単にその後、擬似ランダムに対処することができた場合:

Random randNum = new Random(); 
randNum. NextDouble(Min, Max); 

あなたは「より良い」乱数をしたい場合、あなたはおそらくメルセンヌツイスターアルゴリズムをご覧ください。たくさんの人がいますがalready implemented itあなたのためには

1

ここではCryographically安全な乱数を取得する方法の抜粋です: これはcrytographically強いと8バイト単位で記入しますランダム値のシーケンス。 http://msdn.microsoft.com/en-us/magazine/cc163367.aspx NextDoubleの実装と何の説明を探します。詳細はLonghornのはそんなにdownmoddedされた理由の、について説明するために

1

(デッキシャッフル上CodingHorrorの記事に触発さ)How Random is your Random??"を参照してください

byte[] salt = new byte[8]; 
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
rng.GetBytes(salt); 

ランダムなダブルです。

このリンクは、暗号化乱数(Sameerのような)をビットストリームではなく実際の有用な出力でのみ使用する方法のgooの例です。

関連する問題