在范围内生成一组唯一元素

时间:2016-05-18 16:45:07

标签: c++ vector

开始我只是学习C ++。

我正在尝试创建一个四个不同整数的向量,范围从0:9。我正在使用种子和randint()函数在每次运行程序时获取不同的随机数。我遇到的问题是在收到随机数后如何确认该值尚未保存在向量中。我的代码示例。

int seed()
{
    // Produce computers numbers
    int seed;
    int x;
    cout << "Please enter any Integer!\n";
    cin >> x;
    seed = randint(x) % 10;
    return seed;
}

int main ()
{
    while(keys.size() !=4)
    {
        key = seed();
    }
}

正如你所看到的,int key现在保存了随机数,但我不想使用keys.push_back(key),直到我确认该键与向量中当前保存的任何其他数字是唯一的。

3 个答案:

答案 0 :(得分:8)

如何使用std::unordered_set存储数字?只要大小小于4(例如循环),就加上它。

如果你需要它在矢量中,那么你可以在集合中生成数字后创建矢量。

答案 1 :(得分:1)

您正在寻找的是Fisher-Yets

的随机算法

您创建了一个元素数组{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 。然后遍历每个元素,并使用范围

中的随机索引进行交换
std::vector<int> GenerateRandomUniqueNumbers(int len)
{
    if(len > 10) // Early exit
        return std::vector<int>();

    std::vector<int> range(10);
    std::iota(range.begin(), range.end(), 0); 
    // or just
    // std::vector<int> range = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    for(int i = 0; i < len; ++i) 
    {
        int j = random() % range.size();
        std::swap(range[i], range[j]);
    }
    range.resize(len);
    return range;
}

然后获取数组的前四个元素Range

您可以将循环限制为仅四次迭代。

答案 2 :(得分:0)

您可以使用lower_bound找到正确的插入点,以使矢量保持正常。然后,在插入之前,可以使用binary_search来判断向量中是否有任何元素。