c++ - 随机重新排列数组中的元素而不重复
问题描述
我有一个大小为 9 的固定数组,我正在尝试随机重新排序而不重复。
这是以下代码:
class numbers{
int randomIndexCount;
public:
void randomArray( int numArray[],int size){
randomIndexCount = 0;
for (int i = 0; i < size; i++)
{
int RandomIndex = rand() % size;
randomIndexCount++;
numArray[i] = numArray[RandomIndex];
cout << numArray[i] <<endl;
}
}
int main(){
srand(time(0));
int numArray[9]= {1,2,3,4,5,6,0,0,0};
numbers n;
n.randomArray(numArray,9);
return 0;
}
到目前为止,我能够使用给定的元素随机重新排序数组,但是我不确定如何摆脱重复。输出应该是 {1,2,3,4,5,6,0,0,0},但顺序是随机的。我无法使用 shuffle 功能,只能使用 rand。我不确定如何删除重复条目
这就是我的想法 1) 使用给定的索引检查该值是否已经存在,如果存在则跳过这一行“numArray[i] = numArray[RandomIndex];”。但是,这种方法效率不高,因为我确信这太耗时了。有没有办法删除重复值所以我的输出是这样的:
{0,1,0,6,2,0,5,3,4}
解决方案
您正在使用 for 循环内的分配复制元素
numArray[i] = numArray[RandomIndex]
而是将元素分配给数组的位置,您需要交换这些元素,如下所示:
class numbers
{
int randomIndexCount;
public:
void randomArray (int numArray[], int size)
{
randomIndexCount = 0;
// Use srand with a time seed value in order to
// have different results in each run of the programm
srand (time (NULL));
for (int i = 0; i < size - 1; i++)
{
int swap = numArray[i];
//take a random index from 0 to i
int j = rand () % (size);
numArray[i] = numArray[j];
numArray[j] = swap;
cout << numArray[i] << endl;
}
}
};
int main ()
{
int numArray[9] = { 1, 2, 3, 4, 5, 6, 0, 0, 0 };
numbers n;
n.randomArray (numArray, 9);
return 0;
}
这将是包含数组中所有数字的输出:
5
2
0
6
3
0
1
0