生成一次exaclty的随机数

时间:2015-11-01 14:49:44

标签: c++ random

我需要创建一组0到800之间的随机数。问题是我需要快速执行此操作,每个数字只返回一次。

我目前的做法是:

  • 创建一个包含0到800之间数字的std::vector
  • 使用numberVector[rand() % numberVector.length()]
  • 选择一个号码
  • 从矢量
  • 中删除此号码

我必须经常这样做,而且目前的方法很慢。有没有办法在这里加快速度?

3 个答案:

答案 0 :(得分:4)

  1. 创建一个包含0到800之间数字的std::vector
  2. 随机播放矢量。
    这应该很有用:c++ - How to shuffle a std::vector? - Stack Overflow
  3. 从头到尾逐个取向量的元素。您不必删除元素:只存储上次使用元素的索引。

答案 1 :(得分:1)

  1. std :: shuffle(std :: random_shuffle)你的std :: vector
  2. pop_back elements

答案 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()函数。