我刚刚用c#和WinForms开始了我的第一个小项目,我已经在这个功能上停留了几天了。
我有一个数组大约60个picturebox在它,当我按下一个按钮,我希望它从中随机选择一个,但不是连续两次。
我想我正在寻找类似的东西:
static Random rnd = new Random();
int lastPick;
if (checkBox1.Checked == true)
{
int RandomPick = rnd.Next(pictureBoxArray.Length);
lastPick = RandomPick;
PictureBox picBox = pictureBoxArray[RandomPick **- lastPick**];
picBox.BorderStyle = BorderStyle.FixedSingle;
}
我也试着创建一个包含我最后一次选择的列表,并试图使用这个,但它也没有工作,它给了我一个超出范围的异常。
static Random rnd = new Random();
int lastPick;
List<int> lastNumber = new List<int>();
if (checkBox1.Checked == true)
{
int RandomPick = rnd.Next(pictureBoxArray.Length);
lastPick = RandomPick;
lastNumber.Add(lastPick);
PictureBox picBox = pictureBoxArray[RandomPick - lastNumber.Count];
picBox.BorderStyle = BorderStyle.FixedSingle;
}
任何帮助或提示进入正确的方向将不胜感激
我觉得你把问题复杂化了。您可以简单地将最新的索引存储在一个变量中(就像您正在做的那样),然后生成一个随机数,直到它与变量中的数字不同。下面是一个示例代码片段:
int lastPick;
while (true) {
int randomPick = rnd.Next(length);
if (randomPick != lastPick) {
lastPick = randomPick;
// Do things here.
break; // This breaks the loop.
}
// If the previous if-statement was false, we ended
// up with the same number, so this loop will run again
// and try a new number
}
你很接近了,只要随机选择,直到新的选择与前一个不一样。
int lastPick = -1;
int randomPick = -1;
if (checkBox1.Checked == true)
{
while (randomPick == lastPick)
{
randomPick = rnd.Next(pictureBoxArray.Length);
}
lastPick = randomPick;
PictureBox picBox = pictureBoxArray[randomPick];
picBox.BorderStyle = BorderStyle.FixedSingle;
}
由于其他答案使用while循环,因此我想提供一种不使用while循环的方法。创建一个索引列表,初始化为包含数组中所有可能的索引。此解决方案需要System.Linq
.
将先前选择的索引初始化为-1
int lastChosenIndex = -1;
创建一个包含数组中所有可能索引的列表。
List<int> indicesList = Enumerable.Range(0, pictureBoxArray.Length).ToList();
现在当你想要一个索引到你的数组中,你从索引列表中获得索引。
var randomIndex = random.Next(indicesList.Count - 1);
var randomItem = pictureBoxArray[indicesList[randomIndex]];
我们将从索引列表中删除这个选定的索引,因此它不能再被选中。首先,我们需要添加回之前删除的索引(如果它不是-1),因为它现在是一个有效的选择。
if (lastChosenIndex > -1)
// Use Add so the index into this list doesn't change position
indicesList.Add(lastChosenIndex);
lastChosenIndex = indicesList[randomIndex];
// by removing the index at this position, there is no way to choose it a second time
indicesList.RemoveAt(randomIndex);
的好处是,如果您想永远不显示重复,您可以删除最后选择的索引代码,它将永远不会显示重复。与其他答案相比,这有点冗长,但我想说明的是,除了使用while循环的蛮力之外,还有一种替代方法。