이것은 내 시나리오입니다. 범위 내에서 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
에서 해당 오류를 제공하지만 난 그것을 알아낼 수 없으며, 더 나는 괴상 내가지고있어, 그것을 확인, 모든 단일 라인에서 디버깅 및 중지를 시도했습니다.
미리 감사드립니다. 필요한 모든 것을 갖기를 바랍니다.
마리오.
멀리까지 나는 당신이 당신의 단추를 섞고 싶다는 것을 이해합니다. http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle 잘 맞습니다. –
감사합니다. Lukas. 피셔 - 예이츠 (Fisher-Yates) 접근법은 내가 모방하려는 것인데, 셔플 링은 실제로 문제가 아니었고, 아래에 설명 된 바와 같이 잘못된 IF 문 검사로 인해 오히려 오류가 발생했습니다. 해결되었으므로 다시 한 번 귀하의 의견과 흥미로운 읽기에 감사드립니다. – Mario