2012-05-08 25 views
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秒)、または30、20、10のように10,30,20を返します。確かに分かりませんが、それは私が「ランダム」と呼ぶものではありません。

私が記述した問題に対処する方法はありますか、または他の方法がありますか?

+2

完全ランダム?私は誰も、擬似乱数のみを実証的にランダムシーケンスを生成する方法を知っているとは思わない。 – Oded

+3

ランダムを繰り返すことができます。それはまだランダムです。以前に見られた値を除外することによって、あなたは明らかに*ランダムではありません。 – Yuck

+2

コントロールに名前を付ける必要があります。 – SLaks

答えて

8
textBox4.Text = (2 * rand.Next(min/2, max/2)).ToString(); 
+0

秒で私を打つ:) +1良い答え –

+0

あなたのソリューションは100k繰り返しの2倍の速さです!言及する価値があるのは、1を引く必要はないということだけです。例えば、区間[0-988]の値を取得するには、「min」を0に、「max」を1kに設定する必要があります。 [0-1000]を取得する場合は、「max」を1001に設定する必要があります。 – Alex

2

も簡単にはあなたが私が認める愚かな用語である(「よりランダム」を取得するためにRNGCryptoServiceProviderを使用することができます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(); 
} 
2
Random random = new Random(); 

int nextnum = random.Next(min/2,max/2) * 2 
1

して結果を取得し、それを掛けることであろう)番号。 MSDNのドキュメントページには素晴らしいサンプルがあります。

他の人もお勧めするように、結果に2を掛けて偶数を得ることができます。

1

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

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

次に、ランダムな整数から偶数を作成する方が、偶数のものが見つかるまでループするよりはるかに簡単です。ただ1つの乱数を生成し、最下位ビット:myRand.Next(min, max-1) & ~1;をクリアしてください。まともなRNGは、すべてのビットにわたって均一な分布をしているので、ビットをクリアすることは、1ビット以上のエントロピーを減らしてはいけません。

「完全にランダム」な部分に戻ると、Randomは擬似乱数ジェネレータを提供します。これは、現在のシステム時間の最も重要ではない部分であるランダムな値に基づいて1回播種されますが、同じシードを指定すると、RNGはすべての実行で同じ数値を確実に確定的に生成します。真のランダム性(a.k.a. 'エントロピー')が必要な場合は、決定論的な計算のために構築されたマシン上でそれを生成することがどれほど難しいのか驚くでしょう。 UNIXやUnixライクなシステムでは、通常、ハードディスクのアクセスタイミング、ネットワークノイズ、その他の実際のランダム性のソースを使用して、特別なカーネル生成ファイル(/dev/random)を使用してエントロピーのプールを提供し、それらを非常に複雑な計算を使用して一様分布。Windowsはおそらく同じことをすることができますが、私はこれを.NETや古典的なWin32 APIのいずれのAPIにも気付かない。