当我运行代码时,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
答案 0 :(得分:1)
srand()
函数接受种子并初始化伪随机数字生成器。
伪随机数生成器不是随机的。相反,它会生成由种子决定的非常固定的数字序列。不同的种子将产生不同的序列,但是相同的种子,即使在几年后,也将产生相同的序列。 (这是一个功能 - 它允许您调试行为是“随机”的程序。)
在您的情况下,每次调用construct
函数时,您都会为随机数生成器播种。这是错的。您应该在main()
函数中为RNG播种一次。
目前,您的构造函数将快速运行。你的种子基于time()
。因此,您很可能会一次又一次地获得相同的结果,因为您的函数完成得非常快。
(有点像,当你坐在会议中等待它结束时,你会继续检查时钟 - 它总是在同一时间......)
无论如何,你调用srand(X)(无论X是什么),然后再调用很少的指令再次调用srand(X)。所以你得到了相同的随机数序列,只使用了第一个!
如果您从main调用了srand()
,那就没关系。如果你没有调用srand()那就没关系。但事实上,你总会得到
srand(X)[0]作为构造函数中的随机数。