【问题标题】:How to stop duplicates values in an array in C如何停止C中数组中的重复值
【发布时间】:2018-07-10 18:23:49
【问题描述】:

我正在用 C 创建一个 5x5 棋盘游戏。我遇到的问题是,当我使用 rand() 时,它会重复一些数字。如何停止重复和 0?

抱歉,问题太基本了。我是 C 新手。

int createboard() {

  int rows;
  int columns;
  int board[5][5];
  int board2[5][5];

  srand(time(NULL));

  for (rows = 0; rows < 5; rows++) {
    for (columns = 0; columns < 5; columns++) {
      randomNumber = rand() % 25;
      board[rows][columns] = randomNumber;
    }
  }
}

【问题讨论】:

  • 我的问题是你为什么想使用rand()。你显然不想要随机的数字;您想要一组特定数字的随机顺序,这是非常不同的事情,因此生成随机数不是答案。
  • 您必须跟踪已经生成的数字。围绕 rand 函数运行一个 while 循环,并在获取新的唯一数字时退出它。这是最简单的方法。这可以通过一个包含 25 个布尔值的附加数组来帮助,这些值对应于随机数的状态(已经生成 = true,新数字 = false)。我必须在这里发布它,以便@Quicky 可以看到它。否则它会被否决。
  • rand 是一个标准的 C 函数,可用于生成随机数。有关此功能质量的更多信息在这里:cboard.cprogramming.com/c-programming/…
  • @VladP:您应该将答案放在答案部分,在那里可以进行同行评审,其中可能包括反对票。不要亲自投票,我没有,在我写这篇文章的时候,我下面的回答有一个反对票。

标签: c


【解决方案1】:

如果两次抽取相同数字的概率为零,rand() 将不是一个特别好的生成器。

这里的标准方法是生成带有连续数字的board,然后通过随机交换元素一定次数来随机播放它。

一个好的洗牌算法是https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

【讨论】:

  • 很好的解决方案,也许有点矫枉过正。
【解决方案2】:

自投反对票后已删除。这就是它被删除的原因。

【讨论】:

  • 但这只是解决使用错误设计的固有限制的笨拙方法。
  • 这种方法的一个问题是,您假设rand 实现在其周期性循环中绘制数字,这样当结果在函数% 25 下转换时,它们完全填充范围 [ 0, 24]。 C 标准没有做出这样的保证(一个简单的反例是 rand 实现,它只绘制偶数),所以这种方法可能导致无限循环。当然,这不太可能,但它确实说明了该技术的一个重要缺陷。
  • @Bathsheba:虽然它没有在 C 标准中正式说明,但我相信该标准的意图是 rand 旨在从 [0, RAND_MAX] 中的整数中选择统一的分配。仅返回偶数值的rand(始终,而不仅仅是在某些有限的子序列中)将是有缺陷的。
【解决方案3】:

使用 srand() 函数代替 rand 函数。 rand() 将在每个程序之后给出相同的数字。 参考这个寻求帮助。这是为了改进您的程序,这不是答案 Rand() vs srand() function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    相关资源
    最近更新 更多