我目前正在编写一个程序,它在大多数情况下完成,在接收文件的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左右的结果,效率非常低。我觉得好像在这一点上这将是非常低效的。 我不是在谈论代码的效率,比如缩短一些序列并压缩它以使它更漂亮,我或多或少地教某人,并且在达到这一点时我得出的结论是可以用更好的方式完成,只是不知道它可能是哪种方式......
答案 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());