使用rand()在C中生成一个随机的整数序列

时间:2014-03-03 01:27:14

标签: c random

我正在尝试实现一个函数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;
}

会像这样的工作循环吗?时间是否以正确的方式初始化?

5 个答案:

答案 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();