2011-11-11 62 views
1

這個代碼是越野車,但無法弄清楚爲什麼...想用7個獨特的隨機整數填充數組而不使用數組列表或linq!我知道這個邏輯是不行的......C#使用唯一整數填充數組無Linq或ArrayLists;

class Program 
{ 
    static void Main(string[] args) 
    { int current; 
     int[] numbers = new int[7]; // size of that array 
     Random rNumber = new Random(); 
     current = rNumber.Next(1, 50); 
     numbers[0] = current; 
     Console.WriteLine("current number is {0}", current); 
     for (int i=1;i<7;i++) 
     { 
      current = rNumber.Next(1, 50); 
      for (int j = 0; j < numbers.Length; j++) 
      { 
       do 
       { 
        if (current == numbers[j]) 
        { 
         Console.WriteLine("Duplicate Found"); 
         current = rNumber.Next(1, 50); 
        } 
        else 
        { 
         numbers[j++] = current; 
         break; 
        } 
       }while (current == numbers[j]); 

      }//inner for 

     }//outer for 
     for (int l = 0; l < 7; l++) // DISPLAY NUMBERS 
     { 
      Console.WriteLine(numbers[l]); 
     } 

    }// main 
}//class 
+1

這是我承擔的功課嗎? – BrokenGlass

+1

您是否嘗試過使用調試器? –

+0

它是brokenglass – Marin

回答

3

我相信你正在尋找的隨機數,所以對方的回答是不是你在找什麼。

這裏有幾個問題。

  • 內循環正在測試重複項。但是,由於它使用的是numbers.length,因此它從0到數組的末尾。這應該是i,以便與已設定的值進行比較。無論您是否設置了任何元素,numbers.length始終爲7。

  • 賦值使用j,所以假設第一個元素不是重複的,每次都會被覆蓋。那應該是numbers[i] = current;。由於for正在處理增量,因此無需++。

  • 如果您確定某個數字是重複的,則應將j重置爲zer,以便再次檢查整個列表,而不是在中間有一段時間。

沒有一個完全重寫,這些變化將是這個樣子:

 for (int i=1;i<7;i++) 
    { 
     current = rNumber.Next(1, 50); 
     for (int j = 0; j < i; j++) //----------------- loop through set values 
     { 
      if (current == numbers[j]) 
      { 
       Console.WriteLine("Duplicate Found"); 
       current = rNumber.Next(1, 50); 
       j = 0; // -----------------------reset the counter to start over 
      } 
     }//inner for 

     // if we got here there is no duplicate -------------------------------- 
     numbers[i] = current; 

    }//outer for 

(請注意,我沒有測試此代碼,只需添加的變化)

+0

測試了它,我完全忘記了重置j爲0, – Marin

4

要填充7個獨特的整數數組,而無需使用 的ArrayList或LINQ!

int[] list = new int[7]; 
for (int i = 0; i < list.Length; i++) 
{ 
    list[i] = i; 
} 


EDIT

我改變了你的內部循環,如果隨機數是已經在陣列中;創建一個新的隨機和復位j爲0

 for (int i = 1; i < 7; i++) 
     { 
      current = rNumber.Next(1, 50); 
      for (int j = 0; j < numbers.Length; j++) 
      { 
       if (current == numbers[j]) 
       { 
        Console.WriteLine("Duplicate Found"); 
        current = rNumber.Next(1, 50); 
        j = 0; // reset the index iterator 
       } 
      }//inner for 
      numbers[i] = current; // Store the unique random integer 
     }//outer for 
+1

我們都知道OP意味着7個獨特的**隨機**整數,但是這實際上是**實際**問題的最佳答案。 +1 –

+1

雖然你可能想要'new int [7]'正確嗎? –

+0

我的意思是隨機先生,我的歉意 – Marin

1

你保持覆蓋相同指標的一樣,還檢查了太多指數造成第一個顯示爲在任何時候這是假的副本.. 。

將其更改爲:

for (int i=1;i<7;i++) 
{ 
    current = rNumber.Next(1, 50); 

    for (int j = 0; j < i; j++) ///< change to j < i. no need to check the others 
    { 
     do 
     { 
      if (current == numbers[j]) 
      { 
       Console.WriteLine("Duplicate Found"); 
       current = rNumber.Next(1, 50); 
      } 
      else 
      { 
       numbers[i] = current; ///< not j++ but i to prevent writing at the same locations over and over again 
       break; 
      } 
     }while (current == numbers[j]); 
    }//inner for 
}//outer for 
0

這個怎麼樣?

int[] list = new int[7]; 
var rn = new Random(Environment.TickCount); 
for (int i = 0; i < 7; i++) 
{ 
    var next = rn.Next(1, 50); 
    while(Contains(list, next)) 
    { 
     next = rn.Next(1, 50); 
    } 
    list[i] = next;  
} 


private bool Contains(IEnumerable<int> ints, int num) 
{ 
    foreach(var i in ints) 
    { 
     if(i = num) return true; 
    } 
    return false; 
} 
+0

應該不會得到(Contains(next))而不是!的新值包含? –

+1

添加第二個函數可顯着提高可讀性。 –

+1

優秀和簡單,但也許使用rNumber.Next(1,50)。 – Casperah