我需要创建一组0到800之间的随机数。问题是我需要快速执行此操作,每个数字只返回一次。
我目前的做法是:
std::vector
numberVector[rand() % numberVector.length()]
我必须经常这样做,而且目前的方法很慢。有没有办法在这里加快速度?
答案 0 :(得分:4)
std::vector
答案 1 :(得分:1)
答案 2 :(得分:1)
从矢量
中删除此编号
你可能为此做了太多工作。请记住,例如,从向量的末尾删除比从向量的前面删除要快得多。
由于您不关心数字所在向量中的 ,您可以通过将要删除的数字移动到向量的末尾来加快速度; e.g。
int take_from_vector(vector<int> &vec, size_t pos)
{
int rv = vec[pos];
swap(vec[pos], vec.back());
vec.pop_back();
return rv;
}
但是,如果你只生成一些东西,那么使用拒绝抽样可能会更快:你跟踪你生成的数字,然后拒绝任何重复。 e.g。
int generate_another_number(set<int> &already_generated, int bound)
{
while (true) {
int rv = rand() % bound;
auto pos = already_generated.insert(rv);
if (pos.second) { return rv; }
}
}
根据您生成的内容,您可能希望使用unordered_set<int>
代替set
。或者甚至可以使用vector
并迭代向量以查看它是否包含生成的数字。
P.S。考虑使用C ++的随机数生成功能,而不是古老的rand()
函数。