为什么函数不在每个循环中提供新值?

时间:2014-03-05 08:08:20

标签: c++ function loops

在这段代码中,我想在循环中调用一个函数,在每次迭代中提供一个新的随机数。但是,它不起作用,输出总是相同的,如“2 2 2 2”或“5 5 5 5”。出了什么问题?

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int vertex (int x) {

srand(time(NULL));
x = rand()%10+1;

}


int main()
{

const int size =4;
int a;
int arr[size];

 for (int i=1;i<=size;i++){
        arr[i] = vertex(a) ;
    cout << arr[i] << " ";
    }

return 0;
}

4 个答案:

答案 0 :(得分:1)

您正在使用rand播种time(NULL),并且没有足够的工作可以在循环内更改该值。这导致值在rand的每次调用中返回相同的值(即time(NULL)播种vertex的第一个值。)

不是在vertex函数中播种,而是在main函数中播种一次。

您还需要对代码进行一些修改才能使其正常工作,因为它目前无法编译。

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int vertex() {
    // x parameter removed, was not actually being used
    return (rand() % 10 + 1);
}


int main() {

    const int size = 4;
    int a;
    int arr[size];
    // seeding rand once, prior to usage
    srand(time(NULL));
    // initial i value changed to 0, and changed condition to 'less-than', otherwise you'd end up trying to reference an invalid index (size is 4, index is 0-3)
    for (int i = 0; i < size; i++) {
        arr[i] = vertex();
        cout << arr[i] << " ";
    }

    return 0;
}

答案 1 :(得分:1)

每次在函数srand(time(NULL))内都不应该调用vertex

相反,在函数main中(在循环之前)将其称为一次

代码中的其他(无关)问题是:

for (int i=1;i<=size;i++)

您需要将其更改为:

for (int i=0;i<size;i++)

最后,在函数vertex中你需要return x(不过,我猜你只是忘了把它写在你的问题中,因为我无法看到你的程序如何编译否则)...

答案 2 :(得分:0)

您只需拨打一次srand(time(NULL));

int main()
{
    srand(time(NULL));
    ...

另外,将您的功能更改为:

int vertex () {
   return(rand()%10+1);
}

第三,正如所指出的,你的数组中有一个错误。

for (int i=1;i<=size;i++){

将其更改为:

for (int i=0;i<size;i++){

答案 3 :(得分:0)

1.您应该只拨打srand(time(NULL))一次!

2.将您的vertex功能更改为

int vertex (int x) {
    return rand()%10+1;
}

3. int arr[size];的索引从0到size-1。变化

for (int i = 1; i <= size; i++)

for (int i = 1; i < size; i++)