在这段代码中,我想在循环中调用一个函数,在每次迭代中提供一个新的随机数。但是,它不起作用,输出总是相同的,如“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;
}
答案 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++)