winforms 检查重复随机输出的更有效方法?

7gcisfzg  于 2023-03-03  发布在  其他
关注(0)|答案(2)|浏览(117)

尝试改变一些按钮的位置使用随机函数,我目前使用3 while循环的设置为我的每一个按钮.它的作品,但我想知道是否有一个更有效的方法来防止随机输出从是相同的比我有什么?(我很新的编程,所以请让我知道我如何可以改进.谢谢!!:D)

Random r = new Random();

int location = r.Next(0, 3);
btnCorrect.Location = new Point(xCoordinates[location], positionY);

int location2 = r.Next(0, 3);
while (location2 == location)
{
    location2 = r.Next(0, 3);
}

btnIncorrect1.Location = new Point(xCoordinates[location2], positionY);

int location3 = r.Next(0, 3);
while (location3 == location|| location3==location2)
{
    location2 = r.Next(0, 3);
}

btnIncorrect2.Location = new Point(xCoordinates[location2], positionY);
nue99wik

nue99wik1#

对于这类任务,通常的解决方案是使用Fisher–Yates shuffle,在您的情况下,您可以移动索引:

var rnd = new Random();
var indexes = Enumerable.Range(0, 3).ToArray();
for (int i = 0; i < indexes.Length; i++)
{
    var j = i + rnd.Next(indexes.Length - i);
    var element = indexes[i];
    indexes[i] = indexes[j];
    indexes[j] = element;
}

// use indexes to select elements
// i.e. location = indexes[0], location1 = indexes[1], location2 = indexes[2]
c7rzv4ha

c7rzv4ha2#

这是@gurustron的answer的另一个变体,该解决方案使用Random对值进行排序

var rnd = new Random();
var indexes = Enumerable.Range(0, 3).OrderBy(_ => rnd.Next(1000)).ToArray();

相关问题