2

C#でランダムな偶数を生成するための良い方法はありますか?私はこのコードを思いついた:

    Random RandString = new Random(0);

コード:

    private void button6_Click(object sender, EventArgs e)
    {
        int min = 0;
        int max = 50;

        int rand = RandString.Next(min, max-1);
        while (rand % 2 == 1) // odd
        {
            rand = RandString.Next(min, max-1);
        }

        textBox4.Text = "" + rand;
    }

このコードの問題:

  • 私の現在の解決策はすべての中で最速ではないかもしれません
  • 多くの場合、この方法で生成された数値は同じシーケンスで繰り返されます。たとえば、5回の反復の後、8、10、20、30、16を取得できます。さらにクリックすると(15秒間など) 、10、30、20を連続して取得するか、30、20、10を取得できます。わかりませんが、それは私が「ランダム」と呼んでいるものではありません。

それで、私が説明した問題に対処する方法はありますか、または他の方法はありますか?

4

5 に答える 5

9
textBox4.Text = (2 * rand.Next(min / 2, max / 2)).ToString();
于 2012-05-08T19:03:53.817 に答える
2
Random random = new Random();

int nextnum = random.Next(min/2,max/2) * 2
于 2012-05-08T19:04:27.463 に答える
2

さらに簡単なのは、結果を取得して2を掛けることです。

private void button6_Click(object sender, EventArgs e)
{
    int min = 0;
    int max = 25;

    int rand = RandString.Next(min, max-1)*2;

    textBox4.Text = rand.ToString();
}
于 2012-05-08T19:04:04.457 に答える
1

あなたのアプローチには多くの欠陥があります。

まず第一に、Random.NETからの暗号化の意味では完全にランダムではありませんが、報告する結果よりもはるかに優れているはずです。ほとんどの場合Random、ループの反復ごとに新しいオブジェクトを作成しています。現在のシステム時刻がRNGのシードに使用されるため、次々に非常に短い実行を行うと、同じ疑似乱数シーケンスが得られます。代わりに、Random起動時にインスタンスを1つ作成し、可能な限り長く保持します。

次に、乱数から偶数を作成することは、偶然に偶数が見つかるまでループするよりもはるかに簡単です。1つの乱数を生成し、最下位ビットをクリアするだけですmyRand.Next(min, max-1) & ~1;。適切なRNGは、そのすべてのビットに均一に分布しているため、ビットをクリアしても、エントロピーが1ビットを超えて減少することはありません。

「完全にランダムな」部分に戻る:Random疑似乱数ジェネレーターを提供します。ややランダムな値(現在のシステム時間の最も重要でない部分)に基づいて1回シードされますが、同じシードが与えられると、RNGは実行ごとに同じ数を確実かつ決定論的に生成します。真のランダム性(別名「エントロピー」)が必要な場合は、決定論的計算用に構築されたマシンでそれを生成するのがどれほど難しいか驚くでしょう。UNIXおよびUnixライクなシステムは通常、カーネルで生成された特別なファイルを介してエントロピーのプールを提供します(/dev/random)、ハードディスクアクセスのタイミング、ネットワークノイズ、その他の実際のランダム性の原因などを使用し、かなり複雑な計算を使用してそれらを均一な分布に抽出します。Windowsでもおそらく同じことができますが、.NETまたは従来のwin32APIのいずれかでこのためのAPIを認識していません。

于 2012-05-08T19:14:03.777 に答える
1

RNGCryptoServiceProviderを使用して、「よりランダムな」(私が認めるばかげた用語です)番号を取得できます。MSDNのドキュメントページに素晴らしい例があります。

他の人が推奨しているように、結果に2を掛けるだけで、偶数を得ることができます。

于 2012-05-08T19:08:56.573 に答える