【发布时间】:2016-05-31 20:36:11
【问题描述】:
我编写了一个程序来生成一个随机的数字数组。我知道,如果我创建一个for 结构来放置随机数,我可能会有重复的值。为此,我创建了一个单独的递归函数,它不断寻找重复项并将它们替换为其他值,直到只有不同的数字:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int n, m, k, row[100];
int verif(int v[100], int k)
{
for(int i=0; i<k-1; i++)
for(int j=i+1; j<k; j++)
if(v[i]==v[j])
{
cout<<".";
srand(time(NULL));
v[i]=rand()%100+1;
return verif(v, k);
}
return 1;
}
int main()
{
k=10, n=10;
srand(time(NULL));
row[0]=rand()%n+1;
srand(row[0]);
for(int i=1; i<k; i++)
{
srand(row[i-1]);
row[i]=rand()%n+1;
}
verif(row, k);
for(int i=0; i<k; i++)
cout<<row[i]<<" ";
return 0;
}
我希望你能解释一下为什么verif 中的一个简单的cout 可以让我的程序运行,以及为什么没有它就无法运行。
【问题讨论】:
-
你知道
srand(time(NULL));是做什么的吗? -
请显示真实代码(包括这里缺少的任何全局变量等),这不会编译
-
那你为什么会以错误的方式使用它呢?除非您正在使用古老的超慢机器
-
如果没有您的minimal reproducible example,我们无法准确告诉您。但是,当您删除没有副作用的表达式时崩溃是未定义行为的常见指标。
-
但是在这种情况下,您在调用依赖于秒的函数时会递归,因为 epoch 返回相同的结果 - 有效地递归调用函数一整秒或更长时间。使用
cout语句,递归会减慢,以至于您不会在那一秒内触发堆栈溢出。没有,你会的。 Look at the recursion depth with and without thesleep_forstatement.
标签: c++