2011-12-21 5 views
1

이것은 내 시나리오입니다. 범위 내에서 DISTINCT 난수를 임의로 지정하려면 0에서 9까지의 목록을 만들고 다음과 같은 버튼 배열 :Windows Phone : 목록의 난수 생성이 "범위 예외 예외"를 던졌습니다.

for (int i = 0; i < numbers2BeDrawn; i++) 
{ 
    draft.Add(i); 
} 

for (int i = 0; i < numbers2BeDrawn; i++) 
{ 
    num = rnd.Next(draft.Count()); 
    myNumber = "" + i; 

    if (myNumber.Length < 2) myNumber = "0" + myNumber; 

    buttonList[draft[num]].Content = myNumber; 
    draft.RemoveAt(num); 
} 

그런 식으로 모든 버튼이 0에서 9까지 중복되지 않도록합니다. 지금까지 그렇게 좋았습니다 ...

이제 버튼을 누를 때마다 0에서 최대 9까지 올라갑니다. 나는 그것을 사라지게하고, 그 숫자를 초안 목록에서 빼고 나머지는 셔플하고 분산시킵니다. 다시 나머지 활성 버튼들, 코드의 존재는 :

private void btn_Click(object sender, RoutedEventArgs e) 
{ 
     //write a common procedure for all buttons 
     var myButton = sender as Button; 
     if(myButton != null) 
     { 
      var buttonTag = myButton.Content; 
      btnText = buttonTag.ToString(); 
     } 

     myNum = "" + currentNum; 

    if (myNum.Length < 2) myNum = "0" + myNum; 
     if (myNum.Equals(btnText)) 
     { 
      myButton.Opacity = 0; 
      currentNum++; 

      DrawNumbers(); 
     } 
} 

private void DrawNumbers() 
{ 
     //clear the list and create it again with the numbers left 
     draft.Clear(); 

     for (int i = numbers2BeDrawn; i > currentNum; i--) 
     { 
      draft.Add(i - 1); 
     } 

     //now, distribute them among the VISIBLE BUTTONS ONLY 

     for (int i = 0; i < numbers2BeDrawn; i++) 
     { 
      if (buttonList[i].Visibility == Visibility.Visible) 
      { 
       num = rnd.Next(draft.Count()); 
       myNumber = "" + draft[num]; 
       if (myNumber.Length < 2) myNumber = "0" + myNumber; 
       buttonList[i].Content = myNumber; 
       draft.RemoveAt(num); 
      } 
     } 
    } 

문제는 내가 어떤 버튼을 클릭 때 "범위 예외의 아웃 인수의"를 던진다는 것이다.

 //substitution on the 'for' statement 
     for (int i = 0; i < 5; i++) 
     { 
      if (buttonList[i].Visibility == Visibility.Visible) 
      { 
       num = rnd.Next(draft.Count()); 
       myNumber = "" + draft[num]; 
       if (myNumber.Length < 2) myNumber = "0" + myNumber; 
       buttonList[i].Content = myNumber; 
       draft.RemoveAt(num); 
      } 
     } 

이 '작업'(셔플하지만 첫 번째 5 개 버튼이 아니라 필요에 따라 그들 모두에) 것 같은 오랫동안 나는 '04까지 모든 버튼을 클릭로 : 그것은 내가 할 경우 작동합니다 '이 경우 ('05 '을 클릭하면 예외가 발생합니다.); 다른 번호로 변경하면 명시된 한도에 도달 할 때까지 '작동'합니다.

아이디어가 있으십니까? 내가 안드로이드에서 동일한 코드를 시도하고 그 외에; 대신 카운트(), 대신 제거의) 크기 (하지만 몇 가지 물건 (아무것도 조정하지에 의해 완벽하게 RemoveAt을 등을 작업 한 코드가 완전히 남아 똑같다). 나는 그것을 줄

myNumber = "" + draft[num]; 

//error: ArgumentOutOfRangeException not found. parameter name: index 

에서 해당 오류를 제공하지만 난 그것을 알아낼 수 없으며, 더 나는 괴상 내가지고있어, 그것을 확인, 모든 단일 라인에서 디버깅 및 중지를 시도했습니다.

미리 감사드립니다. 필요한 모든 것을 갖기를 바랍니다.

마리오.

+0

멀리까지 나는 당신이 당신의 단추를 섞고 싶다는 것을 이해합니다. http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle 잘 맞습니다. –

+0

감사합니다. Lukas. 피셔 - 예이츠 (Fisher-Yates) 접근법은 내가 모방하려는 것인데, 셔플 링은 실제로 문제가 아니었고, 아래에 설명 된 바와 같이 잘못된 IF 문 검사로 인해 오히려 오류가 발생했습니다. 해결되었으므로 다시 한 번 귀하의 의견과 흥미로운 읽기에 감사드립니다. – Mario

답변

2

대신 myNumber = "" + draft[i];을 의미합니까?

내 컴퓨터에서이 코드를 실행하고 그것이 오류없이 완료 : 또한 draft.RemoveAt(num);draft.RemoveAt(i);

편집을 설정해야한다. 결국, 초안에는 요소가 포함되어 있지 않습니다. 시나리오와 어떻게 다른지 말해 주시겠습니까?

 Collection<int> draft = new Collection<int>(); 
     int numbers2BeDrawn = 100; int num; string myNumber; Random rnd = new Random(); 

     for (int i = 0; i < numbers2BeDrawn; i++) 
     { 
      draft.Add(i); 
     } 

     for (int i = 0; i < numbers2BeDrawn; i++) 
     { 
      num = rnd.Next(draft.Count()); 
      myNumber = "" + i; 

      if (myNumber.Length < 2) myNumber = "0" + myNumber; 

      //buttonList[draft[num]].Content = myNumber; 
      draft.RemoveAt(num); 
     } 

Edit2가 : 사용 myButton.Visibility = System.Windows.Visibility.Hidden; 대신

+0

어쨌든 충돌, 같은 오류 ... – Mario

+0

충돌하는 줄에 중단 점을 넣으면 어떻게됩니까? i, num, draft.Count()의 값은 무엇입니까? 중급 창 (Ctrl + Alt + I)을 사용하여이 항목을 검사하거나 모스 오버로 검사 할 수 있습니다. 이 경우 –

+0

: I = 0 NUM = 82 draft.count = 그때 그것은 draft.count 모든 충돌 후 0 일, 난 99 (F11을 타격) =까지 계속 경우 99 ... – Mario

0

myButton.Opacity = 0; 그냥 깨끗하게 유지하고 다른 사람을 보여, 토미 슬라브의 대답은 바른 길에 저를 얻었다.

오류는 IF 행의 불투명도 대신 가시성을 확인하면 발생합니다. 나는 '점령'로 그 공간을 유지해야하기 때문에 (여전히 볼 수 있지만를, 안드로이드의 대신 GONE 가시성 속성의 보이지 않는 뭔가가), I 라인을 변경하고 지금은 완벽하게 작동했습니다

다시
for (int i = 0; i < numbers2BeDrawn; i++) 
     { 
      //if (buttonList[i].Visibility == Visibility.Visible) 
      if (buttonList[i].Opacity > 0) 
      { 
       int num = rnd.Next(draft.Count()); 
       myNumber = "" + draft[num]; 
       if (myNumber.Length < 2) myNumber = "0" + myNumber; 
       buttonList[i].Content = myNumber; 
       draft.RemoveAt(num); 
      } 
     } 

, 감사합니다 Markovski 씨에게 많은 도움과 빠른 답변을드립니다.

관련 문제