创建一个填充随机唯一数字的数组[重复]

问题描述 投票:-1回答:2

所以我正在尝试创建一个包含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;
}
c arrays random
2个回答
3
投票

这是一个算法,用于生成从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(包括): 在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
投票

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

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

为了改组n个元素的数组,使用Fisher–Yates shuffle Algorithm,其工作在O(n)时间复杂度。

在你的情况下,取一个从0到19的初始值数组。一旦你对这个数组进行了混洗,你就可以获取这个数组的任何k个元素(在你的情况下为k = 4)并使用它们(它们将是不同的)。可以在online找到此算法的实现。

© www.soinside.com 2019 - 2024. All rights reserved.