[英]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.