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

使用rand()生成C中的随机整数序列,c,random,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; } int选择(无效) { 整数x,整数[4];

我试图实现一个函数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;
}
int选择(无效)
{
整数x,整数[4];
srand((int)time(NULL));

对于(x=0;x您的循环是正确的,但是您的返回语句将不起作用。数组
integer
是函数的本地数组,在外部不可用。在这两种情况下,函数都应该返回
int
,而不是数组


如果您想将随机数限制在一个范围内,最好使用mod运算符,例如
rand()%range

您的循环是正确的,但返回语句将不起作用。数组
integer
是函数的本地数组,在外部不可用。在这两种情况下,函数都应该返回
int
,而不是数组


如果要将随机数限制在某个范围内,最好使用mod运算符,例如
rand()%range

不能从函数返回指向局部变量的指针。 看这篇文章的原因是什么

您必须在堆上分配数组

将其更改为:

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;
}
int选择(无效)
{
int x;
int*整数=(int*)malloc(sizeof(int)*4);
srand((int)time(NULL));

对于(x=0;x,不能从函数返回指向局部变量的指针。 看这篇文章的原因是什么

您必须在堆上分配数组

将其更改为:

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;
}
int选择(无效)
{
int x;
int*整数=(int*)malloc(sizeof(int)*4);
srand((int)time(NULL));

对于(x=0;x您可以这样定义
选择\u N()

void choose_N(int integer[4])
{
    int x;
    srand ((int) time(NULL));
    for (x=0; x<4; x++)
        integer[x]=rand();
}

您可以这样定义
选择\u N()

void choose_N(int integer[4])
{
    int x;
    srand ((int) time(NULL));
    for (x=0; x<4; x++)
        integer[x]=rand();
}

两个问题:最重要的是,数组
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);
}
void选择(int*out,int计数){
对于(int i=0;i
两个问题:最重要的是,数组
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);
}
void选择(int*out,int计数){
对于(int i=0;i
关于随机部分: 如果你真的想感受c rand()在时间(0)上的随机性,在使用它生成实际数字之前,你应该运行rand()3次。为了证明这一点,请在打印数字时尝试一个接一个地运行这段代码几次。你会注意到第一段代码几乎相同。我的输出:

1023384829 832292180 1773676349 957893636 
1023401636 1114767429 1248842775 1942837294 
1023418443 1397242678 724009201 780297305 
因此,您的srand应如下所示:

  srand ((int) time(NULL));
  rand(); rand(); rand();
关于随机部分: 如果你真的想感受c rand()在时间(0)上的随机性,在使用它生成实际数字之前,你应该运行rand()3次。为了证明这一点,请在打印数字时尝试一个接一个地运行这段代码几次。你会注意到第一段代码几乎相同。我的输出:

1023384829 832292180 1773676349 957893636 
1023401636 1114767429 1248842775 1942837294 
1023418443 1397242678 724009201 780297305 
因此,您的srand应如下所示:

  srand ((int) time(NULL));
  rand(); rand(); rand();

请注意,这使得调用者负责
free
稍后调用返回值,这是用户3303851可能不知道的:)添加了关于如何使用malloc和free的链接:)请注意,这使得调用者负责
free
稍后调用返回值,这是用户3303851可能不知道的:)添加了一个关于如何使用malloc和free的链接:)很有趣。我根本看不到这种行为。这实际上是可能的,因为OSX使用不同的(遵循C90标准)rand()实现来实现linux。有人在这里提到这一点,这是错误的。你应该只调用
srand()
每个程序一次。特别是如果您是按
时间()进行种子设定的话。
:如果您在一个短循环中这样做,您很可能会重复使用相同的“随机”序列,并且丢弃前三个生成的值不会改变这一点。调用srand()后丢弃几个随机数有一点价值在程序开始时,如果您希望程序相对频繁地重复,但频率低于每秒一次。
/dev/random
是一个更好的种子源,但您仍然应该每个可执行文件只进行一次种子。是的,当然。我只想提一下时间(0)种子问题的一些实现。我不想重复Lee Daniel Crocker关于移动SRAND函数的答案。我发布的结果不是多次调用函数,而是运行可执行文件三次,所以它总是被称为SRAND(time(0))一次。C++的随机性()-这不是一个C问题吗?很有趣。我根本看不到这种行为。这实际上是可能的,因为OSX使用不同的(遵循C90标准)rand()实现来实现linux。有人在这里提到这一点,这是错误的。你应该只调用
srand()<