Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中数字向量的线性搜索+;_C++_Search_Random - Fatal编程技术网

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

C++ c+中数字向量的线性搜索+;,c++,search,random,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++) {

我试图输出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];
    }
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
srand(时间(0));
向量v;

对于(inti=0;i当
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;
}
#包括
#包括
#包括
int main(){
int n=4;
std::向量值(n);
std::设置使用的_值;
对于(int i=0;i
因此,
rand()
近似于真正的生成器,它将返回相同的数字;甚至可能是连续的:您使用
%10
进一步加剧了这一问题

如果不希望重复,则实例化一个包含所有可能需要的数字的向量,然后将其洗牌。
std::shuffle
可以帮助您完成此操作


请参见

挑剔:随机数很可能会重复-事实上,如果您防止重复数字,它们就不再是随机数。这可能不会解决OP的特定问题(它们的代码有什么问题),因此在这种情况下它并没有真正的帮助。我认为应该将它发布到重复的目标上。@user202729:你为什么这么说?你有关于使用要求的更多信息吗?@user202729:在你看来。在我看来,指出算法有缺陷以及原因就足够了。指出具体要求因此,实施中的fic缺陷没有任何好处。不过,您的回答没有坏处。至于性能,瓶颈将出现在
cout
,而不是Fisher Yates(10个数字)。如果您的答案仅包含这些,请投票以重复的方式关闭(IMO)更好。虽然…这稍微好一点,因为它解释了为什么
rand()
生成重复的数字。不确定是否值得。@user202729:但一定要回答-还有时间。如果我喜欢,我会投票。投票永远不会是个人问题。你对如何解决这个问题有什么建议吗?是的。假设你已经在
n
大小的数组中填充了
k
不同的值。还有,这些
k
数字将必须出现在集合中。现在要放置
k+1
第个索引,请生成一个随机数字,并检查它是否出现在集合中。如果不存在,则将其分配到该位置,否则重复。我不清楚您想做什么do@matt请看更新后的答案。我已经向cl提供了代码请验证我在评论中解释的内容。每次运行程序时,更新的答案都会给我相同的随机唯一数,而不是每次运行程序时都给我不同的随机唯一数