我的手上满是物体,每个物体都包含几个字符串。现在它被设置为结构,每个结构都包含一个带有键 1...n 的映射,每个字符串 ( map<int,string> strs
) 一个,如果存在更好的方法,则可以更改。我需要在不重叠的情况下随机访问所有这些字符串,并且知道我已经完成了。我该如何做到这一点,无论是使用地图还是其他数据结构?谢谢。
问问题
155 次
2 回答
5
这是Fisher-Yates shuffle的一些代码:
template <class T>
std::vector<T> shuffle(std::vector<T> &vect)
{
std::vector<T> shuffled = vect;
for(int i = shuffled.size()-1; i >= 1; i--) {
int idx = rand() % (i+1);
T tmp = shuffled[idx];
shuffled[idx] = shuffled[i];
shuffled[i] = tmp;
}
return shuffled;
}
这将接受一个向量,并以随机顺序返回它的副本。如果你有一个字符串向量,你可以像这样使用它(我在这里使用 c++11):
int main()
{
srand(time(NULL));
std::vector<std::string> strs = {"foo", "bar", "baz", "stack", "overflow"};
for(auto &str : shuffle(strs)) {
std::cout << str << std::endl;
}
return 0;
}
当然,如果你像我一样懒惰,那么 random_shuffle() 函数总是在<algorithm>
:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
int main()
{
std::vector<std::string> strs = {"foo", "bar", "baz", "stack", "overflow"};
std::random_device rd;
std::mt19937 g(rd()); // Use a good random number generaor
std::random_shuffle(strs.begin(), strs.end(), g); // this does the shuffle
for(auto &str : strs) {
std::cout << str << std::endl;
}
return 0;
}
希望这可以帮助!
于 2013-10-20T07:13:41.660 回答
0
一个可怕的解决方案,不要这样做。对于大型候选向量非常慢,这具有 n 平方复杂度。洗牌更好,它具有线性复杂性。
std::vector<int> RandomThing(int number, int min, int max)
{
assert(!"RandomThing" && min < max);
std::vector<int> candidates;
for(int i=min; i<max; i++)
candidates.push_back(i);
std::vector<int> result;
for(int i=0; i<number;)
{
int candidate_index = rand() % candidates.size();
result.push_back(candidates[candidate_index]);
std::vector<int>::iterator it = candidates.begin();
std::advance(it, candidate_index);
candidates.erase(it);
}
return result;
}
于 2013-10-20T06:47:05.363 回答