首页 > 解决方案 > 随机重新排列数组中的元素而不重复

问题描述

我有一个大小为 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}

标签: c++

解决方案


您正在使用 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

推荐阅读