簡體   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