开始我只是学习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),直到我确认该键与向量中当前保存的任何其他数字是唯一的。
答案 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
来判断向量中是否有任何元素。