You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++生成无重复枚举元素数组遇重复问题求助

为什么我的无重复枚举数组生成代码会出现重复元素?

我尝试生成一个包含无重复元素的枚举数组,但运行代码时还是会出现重复的情况。以下是我的代码:

const int MAXNO = 6;
enum Fruit {Durian, Papaya, Apple, Orange, Mango, Jackfruit, Strawberry};
int main () {
 srand (time (NULL));
 int size = rand () % 6 + 1;
 Fruit f [size];
 cout << "Size: " << size << endl;
 for (int i = 0; i < size; i++) {
  f[i] = static_cast <Fruit>(rand() % MAXNO);
  for (int j = 0; j < i; j++) {
   do {
    f[i] = static_cast <Fruit>(rand() % MAXNO);
   }while(f[i] == f[j]);
  }
  cout << f[i] << endl;
 }
}

请问这段代码哪里出错了?


嘿,问题出在你检查重复的逻辑上!让我给你拆解一下:

你的内层循环是逐个和之前的元素比较,每次比较都重新生成一次f[i],这会导致一个严重的问题:比如当i=2时,你先和j=0的元素比较,生成一个不等于f[0]的f[2],但接下来j=1的时候,你又重新生成f[2],这时候新生成的值可能又等于f[0]了,但你没有再回去检查j=0的情况,最终就会出现重复。

简单说,你当前的逻辑只能保证f[i]不等于当前的f[j],但没法保证它不等于之前所有已经生成的元素。

修正方案一:修复检查逻辑

我们需要调整逻辑:先生成一个候选值,然后检查它是否和所有之前的元素重复,如果重复就重新生成,直到找到一个不重复的值。代码修改如下:

const int MAXNO = 6;
enum Fruit {Durian, Papaya, Apple, Orange, Mango, Jackfruit, Strawberry};
int main () {
 srand (time (NULL));
 int size = rand () % 6 + 1;
 Fruit f [size];
 cout << "Size: " << size << endl;
 for (int i = 0; i < size; i++) {
  bool isDuplicate;
  do {
    isDuplicate = false;
    f[i] = static_cast <Fruit>(rand() % MAXNO);
    // 检查所有之前的元素是否重复
    for (int j = 0; j < i; j++) {
      if (f[i] == f[j]) {
        isDuplicate = true;
        break;
      }
    }
  } while (isDuplicate); // 重复就重新生成
  cout << f[i] << endl;
 }
}

修正方案二:洗牌法(更高效)

如果size接近MAXNO,上面的方法可能会因为多次重复生成而效率低下。更优雅的方式是先创建一个包含所有枚举值的数组,然后打乱顺序,再取前size个元素:

#include <algorithm> // 需要包含algorithm头文件
const int MAXNO = 6;
enum Fruit {Durian, Papaya, Apple, Orange, Mango, Jackfruit, Strawberry};
int main () {
 srand (time (NULL));
 int size = rand () % 6 + 1;
 // 先创建包含所有可能元素的数组
 Fruit allFruits[MAXNO] = {Durian, Papaya, Apple, Orange, Mango, Jackfruit};
 // 洗牌打乱顺序
 random_shuffle(allFruits, allFruits + MAXNO);
 // 取前size个元素作为结果
 Fruit f[size];
 cout << "Size: " << size << endl;
 for (int i = 0; i < size; i++) {
  f[i] = allFruits[i];
  cout << f[i] << endl;
 }
}

这样既保证了无重复,又避免了反复生成随机数的问题,逻辑也更清晰~


内容的提问来源于stack exchange,提问作者skyzhuzhu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:43:09