2016-02-25 98 views
0

//一般來說,我從一個枚舉中隨機獲取顏色並將其插入到一個新數組中。 當我通過BoxMessage詢問內循環對於每個陣列[我]我得到隨機顏色的預期。 如果我評論(\)消息框並詢問循環外部的Array [1-5],我會爲所有5個消息框獲得相同的顏色。 我相信這是因爲我的循環內的消息框成功地將Enum轉換爲字符串,當我試圖轉換循環中的整個數組(數組[i] .ToString();)它並不完全工作。 請指教....C#WinForm枚舉ToString

public void GetArray() 
    { 


     array = new EnumColor[5]; 
     for (int i = 0; i < 5; i++) 
     { 
      rnd = new Random(); 
      int rndnum = rnd.Next(0, 4); 
      array[i] = (EnumColor)rndnum; 

      MessageBox.Show(array[i].ToString()); 


     } 
     MessageBox.Show(array[0].ToString()); 
     MessageBox.Show(array[1].ToString()); 
     MessageBox.Show(array[2].ToString()); 
     MessageBox.Show(array[3].ToString()); 
     MessageBox.Show(array[4].ToString()); 


    } 
+0

它沒有工作。什麼不起作用,你期待什麼 – Sorceri

+1

我會在循環之外移動'rnd = new Random();'行。 – LarsTech

+0

接收隨機顏色,而不是接收相同的顏色 – tomersss2

回答

1
for (int i = 0; i < 5; i++) 
    { 
     rnd = new Random(); 
     int rndnum = rnd.Next(0, 4); 
     array[i] = (EnumColor)rndnum; 

     MessageBox.Show(array[i].ToString()); 


    } 

你正在覆蓋數組中的元素,不要這樣做。

檢索元素到一個臨時本地變量代替(和使用.Length代替硬編碼的長度的)

本身由Random引起被不正確地接種的錯誤,它是被regerated在每個迭代上。

Random rnd = new Random(); 

for (int i = 0; i < array.Length; i++) 
{ 
    int rndnum = rnd.Next(0, 4); 
    EnumColor selected = (EnumColor)array[i]; 

    MessageBox.Show(selected .ToString()); 
} 
1

你得到相同的顏色,因爲你是在宣告你的每一次循環random情況下,只要將申報外:

rnd = new Random(); 
for (int i = 0; i < 5; i++) 
{ ... } 

如果您想了解更多關於爲什麼Random課程以這種方式工作,你可以看看this answer

0

問題的確是隨機被重新創建爲每個循環。但是這裏有完整的解釋。

當您創建一個隨機時,它使用Environment.TickCount作爲種子值。 (系統啓動後的毫秒數)。所以如果你的循環足夠快,這將始終是相同的值,所以rnd.Next函數將始終返回相同的值。

所以,現在的棘手部分..爲什麼它在循環內的消息框工作?通過顯示消息,等待您單擊確定按鈕後,循環變得更慢。因此下一輪,種子確實發生了變化。這就是爲什麼你有另一個價值。