加扰输入算法的效率

时间:2015-05-10 21:43:59

标签: c++ algorithm vector

我目前正在编写一个程序,它在大多数情况下完成,在接收文件的CPP中,带有编号索引,然后根据初始输入推出一个加扰测验,因此从理论上讲,没有两个是相同。 这是代码

   // There has to be a more efficient way of doing this...                      
  for (int tempCounter(inputCounter);
       inputCounter != 0;
       /* Blank on Purpose*/) {
    randInput = (rand() % tempCounter) + 1;

    inputIter = find (scrambledArray.begin(),
                      scrambledArray.end(),
                      randInput);

    // Checks if the value passed in is within the given vector, no duplicates.
    if (inputIter == scrambledArray.end()) {
      --inputCounter;
      scrambledArray.push_back(randInput);
    }
  }

第一条评论陈述了我的问题。在正常情况下,这种情况不会发生,但如果将其应用于更大的应用程序,那该怎么办?这是有效的,但如果用户想要争夺10000左右的结果,效率非常低。我觉得好像在这一点上这将是非常低效的。 我不是在谈论代码的效率,比如缩短一些序列并压缩它以使它更漂亮,我或多或少地教某人,并且在达到这一点时我得出的结论是可以用更好的方式完成,只是不知道它可能是哪种方式......

1 个答案:

答案 0 :(得分:1)

所以你只想改变数字1..N吗?是的,有一种更有效的方法。您可以使用std::iota构建vector

// first, construct your vector:
std::vector<int> scrambled(N);
std::iota(scrambled.begin(), scrambled.end(), 1);

然后std::shuffle

std::shuffle(scrambled.begin(), scrambled.end(),
             std::mt19937{std::random_device{}()});

如果您没有C ++ 11,则上面的内容如下:

std::vector<int> scrambled;
scrambled.reserve(N);
for (int i = 1; i <= N; ++i) {
    scrambled.push_back(i);
}
std::random_shuffle(scrambled.begin(), scrambled.end());