33

2 つの値の間でランダムな浮動小数点数を生成したいと思います。C#でこれを行う最良の方法は何ですか?

4

6 に答える 6

60

エリックの応答に追加するのは説明だけです。コードが機能する理由を知ることは、どのコードが機能するかを知ることよりも優れていると思います。

説明はこれです:あなたが2.5と4.5の間の数が欲しいとしましょう。範囲は2.0(4.5〜2.5)です。 NextDouble0から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));を返します。
}
于 2008-09-04T18:52:22.103 に答える
20
System.Random r = new System.Random();

double rnd( double a, double b )
{
   return a + r.NextDouble()*(b-a);
}
于 2008-09-04T18:35:15.577 に答える
2
// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);  

ダブルスの場合、Next を NextDouble に置き換えることができます

于 2008-09-04T18:34:53.423 に答える
1

暗号的に安全な乱数を取得する方法の抜粋を次に示します。これにより、8バイトが暗号的に強力な一連の乱数で埋められます。

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

詳細については、「ランダムはどのようにランダムですか??」(デッキシャッフルに関するCodingHorrorの記事に触発されています)を参照してください。

于 2008-09-04T18:54:17.387 に答える
1

Longhornが大幅にダウンモッドされた理由の説明については、次のURLを参照してください。http://msdn.microsoft.com/en-us/magazine/cc163367.aspx NextDoubleの実装と、ランダムダブルとは何かの説明を探してください。

このリンクは、ビットストリームではなく、実際に役立つ出力でのみ暗号化乱数(前述のSameerなど)を使用する方法の良い例でもあります。

于 2008-09-04T19:03:36.100 に答える
1

どのようにランダムですか?疑似乱数を処理できる場合は、次のようにします。

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

「より良い」乱数が必要な場合は、おそらく Mersenne Twister アルゴリズムを検討する必要があります。多くの人がすでにあなたのためにそれを実装しています

于 2008-09-04T18:37:17.990 に答える