2

私はクラスを持っています:

public class MyClass
{
    public int MyMethod()
    {
        Random rand = new Random();

        return rand.Next() % 10 + 1;
    }
}

そしてそれの2つのオブジェクト:

MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();

問題はobj1.MyMethod() == obj2.MyMethod()常にそれです。なぜそれが起こるのですか?それを回避するための最良の方法は何ですか?

4

2 に答える 2

10

静的なランダムオブジェクトを作成する

public class MyClass
{
   public static Random rand = new Random();

   public int MyMethod()
   {
       return rand.Next() % 10 + 1;
   }
}

ランダムで動作しSystem.DatTime.Now.Ticksます。

これが好きなら

Random rand = new Random();

内部的には次のように発生します

Random rand = new Random(System.DateTime.Now.Ticks);

ちょっと考えてみてください。システムで一定ではないのはシステム時間だけです。

Randomクラスを使用するときは、そのオブジェクトを1回作成し、必要に応じてそのメソッドを使用してNext()ください。この状況は、ランダムオブジェクトがループ内に作成されるときにループで発生します。

コードでは、それらは次々に作成され、同じTicksシード値によって作成されます。

静的なランダムオブジェクトを作成すると、それらは同じになりません。

于 2012-05-15T09:40:21.643 に答える
0

Randomあなたは毎回新しいものを作成しています。Random シードとして使用するシード値を明示的に指定せずにの新しいインスタンスを作成する場合System.DatTime.Now.Ticks。呼び出しの速度により、それらは同じ「ティック」で発生しているため、同じシード値が使用されます。すべてのランダムインスタンスは、同じシード値に対してまったく同じ「乱数」シーケンスを生成するため、両方のインスタンスによって同じ「ランダム」値が生成されます。

これはサイトでこれまで何度も取り上げられてきたので、それらの答えの1つを検索する必要があります。

Randomただし、基本的には、オブジェクトを一度作成して再利用する必要があります。これは静的に、または少なくともクラス変数として実行できます。

より良いアプローチを見つけるために、この質問とその回答を読む必要があります。

于 2012-05-15T09:40:32.777 に答える