【发布时间】:2014-08-08 20:43:42
【问题描述】:
好的,所以我正在 WinForms 中编写扫雷应用程序。这是我的第一个 C# 应用程序,因此这是一个巨大的学习过程。我想随机生成两个数字以放入两个单独的数组 mineX 和 mineY 中。这两个数组是所有地雷将在棋盘上放置的坐标。
这就是问题所在,我想确保当它随机生成这些数字时,X、Y 永远不会相同。我已经完成了研究,并且知道如何生成一个数字并使每个数字都独一无二。我的问题是我希望两个随机数的组合是唯一的。
这是我的 placeMines 方法的代码。
private void placeMines()
{
Random rnd = new Random();
for (int i = 0; i < MINE_COUNT; i++)
{
bombX[i] = rnd.Next(0, BOARD_X);
bombY[i] = rnd.Next(0, BOARD_Y)'
}
}
这似乎是一个很容易解决的问题,但我一辈子都想不通。
【问题讨论】:
-
你的意思是 X,Y 的组合必须是唯一的,还是说只要选择了 X=2,其他 X 就不能是 2?
-
对,两者的结合。 X 实际上可能多次等于 2,但对应的 Y 必须不同。
-
如果它们不能重复,那么你就不需要随机数。所以不要使用随机数生成器!
-
当您需要解决此类问题时,识别模式很重要。您不想要一个随机值的集合,您想要一个随机的 order 固定值。称为洗牌,因其与洗牌非常相似而得名。随机播放的标准算法称为 Fisher Yates,以 1938 年解决它的两位统计学家的名字命名。当您查询“c# random shuffle”或“c#fisher yates”时,您将获得大量的 Google 搜索结果。仅此网站就有 11000 个,我们尽量不添加更多 :)