2011-11-12 19 views
0

私はこのオブジェクトの配列を塗りつぶしました。私はそれを埋めて、それがすべて同じ結果であることを繰り返すように頼むまで、私はそれを充分満たしていると思います。私はそれが何かシンプルだと知っていますが、私は今それを逃しています。配列は1つの値を繰り返します

static void Main(string[] args) 
{ 
    int numOFItems = 6; 
    int population = 10; 

    int[] geneList = new int[numOFItems]; 
    Genome[] gen = new Genome[population]; 
    Random rand = new Random(); 
    Genome gene; 

    for (int i = 0; i < population; i++) 
    { 
     gen[i] = new Genome(); 
     for (int j = 0; j < numOFItems; j++) 
     { 
      geneList[j] = rand.Next(0, 4); 
     } 
     gene = new Genome(geneList); 
     gen[i] = gene; 
     Console.Out.Write("\n" + gen[i].ToString()); 
    } 
    for (int i = 0; i < population; i++) 
     Console.Out.Write("\n" + gen[i].ToString() + ";"); 
    Console.ReadLine(); 
} 

class Genome 
{ 
    int[] geneList; 
    int numOFItems = 6; 

    public Genome() 
    { 
     geneList = new int[numOFItems]; 
    } 

    public Genome(int[] geneList) 
    { 
     this.geneList = geneList; 
    } 

    public int[] GeneList 
    { 
     get { return geneList; } 
     set { geneList = value; } 
    } 

    public override string ToString() 
    { 
     return "" + GeneList[0] + GeneList[1] + GeneList[2] 
      + GeneList[3] + GeneList[4] + GeneList[5]; 
    } 
} 

答えて

3

あなたは一度だけgeneListを初期化している - ので、各Genomeは、同じ配列への参照が含まれています。ループ内で宣言とgeneListの初期化を移動します。 でもであることに注意してください。新しいGenomeインスタンスがリストの先頭に作成され、その後に上書きされます。

参照遺伝子反復それぞれの新しいゲノム(geneList)が割り当てられている時に
for (int i = 0; i < population; i++) 
{ 
    int[] geneList = new int[numOFItems]; 
    for (int j = 0; j < numOFItems; j++) 
    { 
     geneList[j] = rand.Next(0, 4); 
    } 
    gen[i] = new Genome(geneList); 
} 
+0

ありがとうございます。ええ、私は今それを取得します。すばらしいです – user1043281

1

は、オブジェクトの[参照GEN [i]が割り当てられたアドレスは、遺伝子によって指さ:だから私はあなたのループは次のようになりべきだと思います。このようにして、最後に生成されたGenome()の値になるように、すべてのオブジェクトを常に取得します。これは、遺伝子が指し示すメモリ位置を上書きし続けるためです。 gen [i]に新しいGenome(geneList)を直接割り当ててみてください。それは内だよう

0
はgeneList配列の宣言を移動

forループ:

 static void Main(string[] args) 
     { 
      int numOFItems = 6; 
      int population = 10; 


      Genome[] gen = new Genome[population]; 

      Random rand = new Random(); 

      for(int i = 0; i < population; i++) 
      { 

       int[] geneList = new int[numOFItems]; 

       for(int j = 0; j < numOFItems; j++) 
       { 
        geneList[j] = rand.Next (0, 4); 
       } 


       gen[i] = new Genome (geneList); 

       Console.Out.Write ("\n" + gen[i].ToString()); 
      } 
      for(int i = 0; i < population; i++) 
      { 
       Console.Out.Write ("\n" + gen[i].ToString() + ";"); 
      } 
      Console.ReadLine(); 
     } 

そうでない場合は、あなただけの1 geneListを使用する(私は少しだけでなく、あなたのコードを簡素化しました) -arrayは、ループの中で毎回変更されますが、すべてのGenomeインスタンスは同じgeneList配列を使用します。 (つまり、それらはすべてその配列への同じ参照を使用します)。

関連する問題