質問

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

役に立ちましたか?

解決

唯一付け加えておきたいことは エリックの応答は説明です。コードがどのように機能するかを知るよりも、なぜコードが機能するのかを知る方が良いと思います。

説明はこうです。2.5 から 4.5 までの数値が必要だとします。範囲は 2.0 (4.5 ~ 2.5) です。 NextDouble 0 から 1.0 までの数値のみを返しますが、これに範囲を乗算すると、0 から 1.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)
{
    return 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の記事からインスピレーションを得た)

どのくらいランダムですか?疑似乱数を扱える場合は、次のようにします。

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

「より良い」乱数が必要な場合は、おそらくメルセンヌ ツイスター アルゴリズムを検討する必要があります。たくさんの人が持っています すでに実装されています でもあなたのために

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top