线性搜索c ++中的数字向量

时间:2018-04-11 07:36:42

标签: c++ search random

我正在尝试输出9个随机非重复数字。这就是我一直在努力做的事情:

    #include <iostream>
#include <cmath>
#include <vector>
#include <ctime>
using namespace std;
int main() {
    srand(time(0));
    vector<int> v;
    for (int i = 0; i<4; i++) {
        v.push_back(rand() % 10);
    }
    for (int j = 0; j<4; j++) {
        for (int m = j+1; m<4; m++) {
                while (v[j] == v[m]) {
                    v[m] = rand() % 10;
                }
        }
        cout << v[j];
    }
}

然而,我经常会重复数字。任何帮助,将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:2)

使用 true 随机数生成器,绘制特定数字的概率不是以先前绘制的任何数字为条件的。例如,我确定你在掷骰子时两次获得相同的数字。

rand(),它大致接近一个真正的发电机,因此会给你相同的数字;甚至连续地:你使用% 10进一步加剧了这一点。

如果你不想要重复,那么实例化一个包含你想要的所有数字的向量,然后 shuffle 它们。 std::shuffle可以帮助您实现这一目标。

请参阅http://en.cppreference.com/w/cpp/algorithm/random_shuffle

答案 1 :(得分:1)

j=0时,您将使用m={1, 2, 3}进行检查 但是当j=1时,您只需m={2, 3}进行检查。

您没有再次使用0th索引进行检查。在那里,你可能会重复。

另外,请注意减少重复数字的可能性,为什么不增加随机值的大小,让我们说100

请通过不断检查std::set中使用的值来查看以下代码以获取不同的随机值:

#include <iostream>
#include <vector>
#include <set>

int main() {

    int n = 4;
    std::vector <int> values(n);
    std::set <int> used_values;

    for (int i = 0; i < n; i++) {
        int temp = rand() % 10;
        while (used_values.find(temp) != used_values.end())
            temp = rand() % 10;
        values[i] = temp;
    }

    for(int i = 0; i < n; i++) 
        std::cout << values[i] << std::endl;

    return 0;
}