c# -随机生成器从数组中排除最后一个数字



我刚刚用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循环的蛮力之外,还有一种替代方法。

相关内容

  • 没有找到相关文章