繁体   English   中英

加扰输入算法的效率

[英]Efficiency of an algorithm for scrambled input

我目前正在用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..N数字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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM