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