2 つの値の間でランダムな浮動小数点数を生成したいと思います。C#でこれを行う最良の方法は何ですか?
6 に答える
エリックの応答に追加するのは説明だけです。コードが機能する理由を知ることは、どのコードが機能するかを知ることよりも優れていると思います。
説明はこれです:あなたが2.5と4.5の間の数が欲しいとしましょう。範囲は2.0(4.5〜2.5)です。 NextDouble
0から1.0までの数値のみを返しますが、これに範囲を掛けると、0から範囲までの数値が得られます。
したがって、これにより、0.0から2.0の間でランダムなdoubleが得られます。
rng.NextDouble()* 2.0
ただし、2.5から4.5の間が必要です。これをどのように行うのですか?最小の数値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) {{ min +(rng.NextDouble()*(max --min));を返します。 }
System.Random r = new System.Random();
double rnd( double a, double b )
{
return a + r.NextDouble()*(b-a);
}
// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);
ダブルスの場合、Next を NextDouble に置き換えることができます
暗号的に安全な乱数を取得する方法の抜粋を次に示します。これにより、8バイトが暗号的に強力な一連の乱数で埋められます。
byte[] salt = new byte[8];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(salt);
詳細については、「ランダムはどのようにランダムですか??」(デッキシャッフルに関するCodingHorrorの記事に触発されています)を参照してください。
Longhornが大幅にダウンモッドされた理由の説明については、次のURLを参照してください。http://msdn.microsoft.com/en-us/magazine/cc163367.aspx NextDoubleの実装と、ランダムダブルとは何かの説明を探してください。
このリンクは、ビットストリームではなく、実際に役立つ出力でのみ暗号化乱数(前述のSameerなど)を使用する方法の良い例でもあります。
どのようにランダムですか?疑似乱数を処理できる場合は、次のようにします。
Random randNum = new Random();
randNum. NextDouble(Min, Max);
「より良い」乱数が必要な場合は、おそらく Mersenne Twister アルゴリズムを検討する必要があります。多くの人がすでにあなたのためにそれを実装しています