创建一个填充有随机唯一数字的数组

时间:2018-09-08 05:52:03

标签: c arrays random

所以我试图创建一个由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;
}

2 个答案:

答案 0 :(得分:3)

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

  • 创建一个包含20个整数的数组randArr:{0,1,2,3,4,4,5,6,7,8,9,10,11,12,13,14,14,15,16, 17、18、19}。这是用来挑选随机数的数组
  • array是4个整数的数组,其中将包含结果
  • i从0到3(包括):
    • ri(包括两端)之间选择一个随机数19。交换randArr[r]randArr[i]
    • 复制到arrayarray[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

答案 1 :(得分:1)

您要生成0到19之间的随机数,并将其填充到数组中,而不能重复。
由于尚未初始化array的元素,因此未初始化的值可能已经彼此不同。在这种情况下,完全不会执行while循环。

其次,每当数组中的任何两个元素匹配时,您都会为数组的每个元素生成随机值。这不是必需的。您只需要为与任何现有元素匹配的元素重新生成随机数。这就是注释中提到的集合结构。

要随机排列n个元素的数组,请使用Fisher–Yates shuffle Algorithm ,其工作时间为O(n),时间复杂度

以您的情况为例,取一个初始值数组,范围为0至19。对这个数组进行混洗后,可以取该数组的任何k个元素(在您的情况下为k = 4)并使用它们(不同)。可以在online中找到此算法的实现。