在链表

时间:2017-02-03 00:32:04

标签: c list pointers recursion random

当我运行代码时,rand()函数似乎生成相同的非随机数(我的意图是在value中生成随机数)。如果我使用形式参数rand()代替length,则代码似乎有效(减少数字)。我哪里做错了?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct node{
    int value;
    struct node *next;    
};

struct node *construct(int);

int main(){
    struct node *list = construct( 5 );

    while( list ){
        printf(" %i\n", list->value);
        list = list->next;
    }

    return 0;
}

//It builds a list of "length" items recursively
struct node *construct(int length){
    struct node *node = (struct node *) malloc(sizeof(struct node));

    srand(time(NULL));

    node->value = rand(); /* unclear part of code */

    if( length - 1){
        node->next = construct( length - 1 );
    }

    return node;
}
/* missing the code to free memory */

/* example of output */
837240329
837240329
837240329
837240329
837240329

1 个答案:

答案 0 :(得分:1)

srand()函数接受种子并初始化伪随机数字生成器。

伪随机数生成器不是随机的。相反,它会生成由种子决定的非常固定的数字序列。不同的种子将产生不同的序列,但是相同的种子,即使在几年后,也将产生相同的序列。 (这是一个功能 - 它允许您调试行为是“随机”的程序。)

在您的情况下,每次调用construct函数时,您都会为随机数生成器播种。这是错的。您应该在main()函数中为RNG播种一次。

目前,您的构造函数将快速运行。你的种子基于time()。因此,您很可能会一次又一次地获得相同的结果,因为您的函数完成得非常快。

(有点像,当你坐在会议中等待它结束时,你会继续检查时钟 - 它总是在同一时间......)

无论如何,你调用srand(X)(无论X是什么),然后再调用很少的指令再次调用srand(X)。所以你得到了相同的随机数序列,只使用了第一个!

如果您从main调用了srand(),那就没关系。如果你没有调用srand()那就没关系。但事实上,你总会得到 srand(X)[0]作为构造函数中的随机数。