所以我试图创建一个由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;
}
答案 0 :(得分:3)
这是一种算法,可以生成从0到20的4个不同数字的数组,这些数组是O(n + m)
,其中n
是4个数字,而m
是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(包括):
r
和i
(包括两端)之间选择一个随机数19
。交换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];
}
答案 1 :(得分:1)
您要生成0到19之间的随机数,并将其填充到数组中,而不能重复。
由于尚未初始化array的元素,因此未初始化的值可能已经彼此不同。在这种情况下,完全不会执行while循环。
其次,每当数组中的任何两个元素匹配时,您都会为数组的每个元素生成随机值。这不是必需的。您只需要为与任何现有元素匹配的元素重新生成随机数。这就是注释中提到的集合结构。
要随机排列n个元素的数组,请使用Fisher–Yates shuffle Algorithm ,其工作时间为O(n),时间复杂度。
以您的情况为例,取一个初始值数组,范围为0至19。对这个数组进行混洗后,可以取该数组的任何k个元素(在您的情况下为k = 4)并使用它们(不同)。可以在online中找到此算法的实现。