我正在尝试实现一个函数int choose_N(void),它生成并返回一个整数N的随机列表(最多四个整数)。我不确定我是否以正确的方式使用rand(),但这是我到目前为止所做的:
int choose_N(void)
{
int x, integer[4];
srand ((int) time(NULL));
for (x=0; x<4; x++)
integer[x]=rand();
return integer;
}
会像这样的工作循环吗?时间是否以正确的方式初始化?
答案 0 :(得分:4)
两个问题:最重要的是,数组integer
是本地的,当你返回时会消失。如果你想在C中返回一组数据,你必须让调用者传入它(见下文)。其次,srand()
只应在每个程序中调用,因此它不属于这样的函数 - 它应该在main
或类似的初始化函数中,否则对该函数的多次调用将是相关的(在最坏的情况下,它们甚至可能是相同的)。所以这是一个更好的方法:
void choose_n(int *out, int count) {
for (int i = 0; i < count; i += 1) {
out[i] = rand();
}
}
int main(int argc, char *argv[]) {
int results[4];
srand(time(NULL));
choose_n(results, 4);
}
答案 1 :(得分:0)
你的循环是正确的,但你的return语句不起作用。数组integer
是函数的本地数组,在外部不可用。在任何一种情况下,您的函数都应该返回int
而不是数组。
如果你想将随机数限制在一个范围内,你最好使用mod运算符,例如rand() % range
。
答案 2 :(得分:0)
您无法从函数返回指向局部变量的指针。 看到这篇文章的原因是什么? Can a local variable's memory be accessed outside its scope?
你必须在堆上分配数组。
将其更改为:
int choose_N(void)
{
int x;
int *integer = (int*)malloc(sizeof(int)*4);
srand ((int) time(NULL));
for (x=0; x<4; x++)
integer[x]=rand();
return integer;
}
完成后不要忘记free()
记忆。
万一你想知道malloc&amp;免费,你可以在这里阅读:http://www.codingunit.com/c-tutorial-the-functions-malloc-and-free
答案 3 :(得分:0)
您可以像这样定义choose_N()
void choose_N(int integer[4])
{
int x;
srand ((int) time(NULL));
for (x=0; x<4; x++)
integer[x]=rand();
}
并使用它喜欢这个
int integer[4];
choose_N(integer);
答案 4 :(得分:0)
关于随机部分: 如果你真的想要感受时间(0)播种的c rand()的随机性,你应该在用它生成实际数字之前运行rand()3次。为了证明这一点,尝试在打印数字时一个接一个地运行此代码。你会发现第一个几乎是一样的。我出去了:
1023384829 832292180 1773676349 957893636
1023401636 1114767429 1248842775 1942837294
1023418443 1397242678 724009201 780297305
所以你的样子应该是这样的:
srand ((int) time(NULL));
rand(); rand(); rand();