1

プログラムに少し問題があります。

プログラムで次のようなクラスを作成しました。

class ClassA
{
    public int number = -1;

    public Random rnd = new Random();
    public void randomize()
    {
         var random = rnd;
         number = rnd.next(4)+2;
    }

}

私はこのように作成したクラスを含む各配列を作成して配列しようとしていました。配列を新しいメソッドに転送して、確認できるようにします。

public static void Main()
{
    ClassA[,] arrayOfClass = new Class[6,6];
    ClassA classA= new Class();
    int i, j;
    for (i = 0; i < 6; i++)
    {
         for (j = 0; j < 6; j++)
         {

              classA.randomize();

              arrayOfClass[i, j] = classA;
         }
    }
    CheckClassA(arrayOfClass);
}
private void CheckClassA(ClassA[,] arrayOfClass)
{
     int i,j;
     for(i=0;i<6;i++)
     {
         for (j = 0; j < 6; j++)
         {
         Console.Writeline("Randoming : "+arrayOfClass[i,j].number);
         {
     }
}

これらを実行すると、コンソールは同じ数を何度も生成しますが、実行ごとに異なります.1回だけランダム化してから、再度ランダム化することはありません.

私の質問は次のとおりです。1.なぜ私のプログラムは一度だけランダム化して、配列のすべての値に対して同じ数を返すのですか? 2. 配列を転送する方法は間違っていますか?

以下の他のタイプを使用して、ランダム化が失敗したかどうかを確認しようとしましたが、期待どおりに乱数を返すため、そうではありませんでした。

    public static void Main()
    {
        ClassA[,] arrayOfClass = new Class[6,6];
        ClassA class= new Class();
        int i, j;
        for (i = 0; i < 6; i++)
        {
             for (j = 0; j < 6; j++)
             {

                  class.randomize();

                  arrayOfClass[i, j] = class;
                  Console.Writeline("Randoming : " + arrayOfClass[i,j].number);
             }
        }
    }

どんな提案や助けも感謝します。ありがとう

4

3 に答える 3

0

random オブジェクトを static にして、クラスのすべてのインスタンスがそれを参照するようにします。

これは、C# が疑似ランダム アルゴリズムを使用しているためです。次の値はすべて、前の値に何らかの形で依存します。

Random クラスのパラメーターなしのインスタンス化では、デフォルトで現在のクロック値が使用されるため、クラスのすべてのインスタンスは同じ開始値で Random オブジェクトを作成し、それらに Next() を呼び出すと同じ値が返されます。この値は別の Next() に使用されます。そしてそれらの値も同じです。

于 2013-03-31T18:39:32.107 に答える
0

あなたが抱えている本当の問題は、配列が各エントリに対して常に同じオブジェクトに設定されていることです。new反復するたびに新しい ClassAを作成する必要があります。そうしないと、最後の .number のみを指すことになります。

もちろん、これは「毎回新しい Random() を使用するだろう」という小さなことに加えて、次のように静的にする必要があります。

public static void Main()
{
        ClassA[,] arrayOfClass = new ClassA[6,6];
        ClassA classA;
        int i, j;
        for (i = 0; i < 6; i++)
        {
                for (j = 0; j < 6; j++)
                {
                    classA = new ClassA(); // MISSING THIS LINE CAUSED ARRAY TO ONLY HAVE LAST ENTRY
                    classA.randomize();

                    arrayOfClass[i, j] = classA;
                }
        }
        CheckClassA(arrayOfClass);
        Console.ReadLine();
    }
    private static void CheckClassA(ClassA[,] arrayOfClass)
    {
            int i,j;
            for(i=0;i<6;i++)
            {
                for (j = 0; j < 6; j++)
                {
                    Console.WriteLine("Randoming : " + arrayOfClass[i, j].number);
                }
            }
    }

     public class ClassA
     {
         public int number = -1;

         public static Random rnd = new Random();
         public void randomize()
         {
             number = rnd.Next(4) + 2;
         }

     }
}
于 2013-03-31T18:40:11.130 に答える