【问题标题】:Creating an array filled with random unique numbers [duplicate]创建一个充满随机唯一数字的数组[重复]
【发布时间】:2018-09-08 05:52:02
【问题描述】:

所以我试图创建一个由 4 个项目组成的数组,随机填充 4 个唯一数字。目前,我有一个非常长的 while 循环,它检查数组中的每个值,如果它们相同,则不断重复。它的编码真的很糟糕,我想知道你们是否可以帮助我找出更好的方法? 这是我目前拥有的。

int array[4];
while(array[0] == array[1] || array[1] == array[2] ||  array[2] == array[3] || array[0] == array[2] || array[0] == array[3] || array[1] == array[3])
{
    array[0] = rand() % 20;
    array[1] = rand() % 20;
    array[2] = rand() % 20;
    array[3] = rand() % 20;
}

【问题讨论】:

  • the set data structure做一些研究。
  • 为什么要重新滚动所有值,例如只有两个是相同的?
  • @Someprogrammerdude 很有趣,但请帮助我了解它如何支持解决方案。假设一个实现良好的集合可用,它如何支持有效地创建四个不同的随机数? IE。比数组更高效或更简单。
  • 在伪代码中:while (size_of_set() < N) { insert_into_set(get_random_value()); } 如果你翻译成真实的代码,那么之后你保证有一组N 唯一的随机数。更容易理解逻辑,不需要过多的条件,并且可以很好地扩展(代码方面)N 可以是 410000 并且代码不会改变。
  • @Someprogrammerdude 我以前从未听说过或使用过集合,如何检查集合中的值?和数组一样吗?

标签: c arrays random


【解决方案1】:

这是一种算法,可生成从 0 到 20 的 4 个不同数字组成的数组,即 O(n + m)n 4 个数字和 m 20 个可能值:

  • 创建一个包含 20 个整数的数组 randArr:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}。这是用于选择随机数的数组
  • array 是一个包含结果的 4 个整数数组
  • 对于 i 从 0 到 3(包括):
    • i19(含)之间选择一个随机数r。交换 randArr[r]randArr[i]
    • 复制到array:array[i] = randArr[i]

这是实现(对合并最后两个步骤进行了轻微改进):

int randArr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
int array[4];
for (int i = 0; i < 4; i++) {
        int r = i + rand() % (20 - i);
        array[i] = randArr[r];
        randArr[r] = randArr[i];
}

https://tech.io/snippet/dGgblEO

【讨论】:

    【解决方案2】:

    您希望生成从 0 到 19 的随机数,并将它们填充到数组中而没有任何重复。
    由于您尚未初始化数组的元素,因此未初始化的值可能已经彼此不同。在这种情况下,while 循环根本不会被执行。

    其次,每次当任意两个元素匹配时,您都会为数组的每个元素生成随机值。这不是必需的。您必须仅为与任何现有元素匹配的元素重新生成随机数。这就是集合结构(在 cmets 中提到的)的作用。

    要打乱一个包含 n 个元素的数组,使用Fisher–Yates shuffle Algorithm它的时间复杂度为 O(n)

    在你的情况下,取一个从 0 到 19 的初始值数组。一旦你打乱了这个数组,你可以取这个数组的任何 k 个元素(在你的情况下 k = 4)并使用它们(它们将是清楚的)。该算法的实现可以在online 找到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 2013-10-28
      • 2013-01-27
      • 2020-11-19
      相关资源
      最近更新 更多