2009-10-31 15 views
47

これは本当に奇妙です。なぜこれが起こっているのかわかりません。 foreachサイクルでは、クラスAのコレクションを反復処理していますが、各クラスについて、r1r2の数値が[-1,1]の範囲から生成されているCount()メソッドを呼び出します。問題は、Random.Nextが各インスタンスに同じ "ランダム"番号を返すことです。最初のインスタンスの結果が0と-1の場合、次のインスタンスから同じ結果が返されます。なぜ、これが起こっているのか教えてください。また、クラスAのインスタンスごとに異なる結果を得ることはできません。これはコードです:Random.Nextは常に同じ値を返します

class a 
{ 
Random rnd = new Random(); 
private void Count() 
{ 
    int r1 = rnd.Next(-1, 1); 
    int r2 = rnd.Next(-1, 1); 
} 
} 
class b 
{ 
List<a> listofA=new list<a>(); 
foreach (a ACLASS in listofA) 
{ 
    ACLASS.Count(); 
} 
} 

答えて

94

問題は、あなたが時間に近すぎるRandomクラスのインスタンスを作成しているということです。

Randomオブジェクトを作成すると、システムクロックの値が設定されます。時間が近すぎるRandomのインスタンスを作成すると、それらはすべて同じランダムシーケンスでシードされます。

単一のRandomオブジェクトを作成し、 "a"インスタンスごとに1つのRandomオブジェクトを作成する代わりに、 "a"クラスのインスタンスを作成するときにそのコンストラクタへの参照を渡します。

+1

-1,0よりも範囲にあなたの番号を与えるために、私は戻って一日中用のビンゴカートンを作る同じ問題を持っていましたクラブ、それから当時私は、これまでに知られていた最悪のトリックを使いました。経験の浅い狂気のためにスレッドを休止しました... クレイジーなことに、静的なランダムな宣言すべての。 –

5

各Aインスタンスにランダムインスタンスを含めます。彼らはすべて同じデフォルトのシード値を得ているようです。おそらく、すべてのAインスタンスに対してスタティックランダムを作成し、それを繰り返し使用するか、AコンストラクタのRandom()インスタンスにシード値を渡したいと思うかもしれません。

8

Randomの新しいインスタンスを非常に近くに作成しています(ループが非常に厳しい)ので、各インスタンスが同じシード値を効果的に使用しています。

より良いアプローチは、1つのインスタンスを作成し、それをCountメソッドに渡すことです。

あなたはproblablyこの次のビットを知っているが、私は完全を期すため、ここでそれを含めます:

MSDNは、この詳細を持っていますが、基本的に、あなたの問題は、あなたが使用しているRandom.Next方法が生成されます。

minValue以上でmaxValueより小さい32ビット符号付き整数。つまり、戻り値の範囲にはminValueが含まれますが、maxValueは含まれません。 minValueがmaxValueに等しい場合、minValueが返されます。

あなたの呼び出しは-1を返しますまたは0

7

クラスのすべてのインスタンスのための単一の、静的な乱数ジェネレータを使用します。このため。

class a 
{ 
    private static Random rnd; 
    static a() { 
     rnd = new Random(); 
    } 
    private void Count() 
    { 
    int r1 = rnd.Next(-1, 2); 
    int r2 = rnd.Next(-1, 2); 
    } 
} 

注変更は私も忘れてしまった-1,1むしろ

+0

私はこの範囲では1を返すことができ、0と-1だけが必要だと思いますか? – Lucas

+0

@Svanteは、コードサンプルに一致するように間隔を開くように質問を編集しました。元の質問では、正確な言語を使用していませんが、閉じた間隔が指定されています。私はコードが間違っていると思うし、閉じた間隔を指定するために質問を元に戻すつもりです。 – tvanfosson

+0

@tvanfossonなぜこれが機能するのか教えていただけますか?私はこの統計を作ることがあなたにランダム性を与える方法を理解していません。私はそれが動作することを知っているが、なぜそうではない。彼らはまだ非常に近いです。ありがとう。 – johnny

関連する問題