为什么在c中使用rand()时每个子进程生成相同的"随机"数字?

Mit*_*est 3 c random process child-process

我正在尝试生成n个子进程,然后让每个子进程请求一个随机数量的资源.但是,每个子节点当前都请求相同数量的资源,但每次运行程序时该数字都会更改.

/* Create the appropriate number of processes */
int pid;
for(int i = 0; i < numberOfProcesses; i++){
    pid = fork();
    if(pid < 0){
        fprintf(stderr, "Fork Failed");
        exit(1);
    }
    else if(pid == 0){
        time_t t;
        srand((unsigned) time(&t));

        printf("Child (%d): %d.", i+1, getpid());

        /* Generate a random number [0, MAX_RESOURCES] of resources to request */

        int requestNum = rand() % (MAX_RESOURCES + 1);
        printf(" Requesting %d resources\n", requestNum);

        exit(0);
    }
    else{ wait(NULL); }
}
Run Code Online (Sandbox Code Playgroud)

更新: 以下似乎已经解决了这个问题.感谢您的帮助,评论者!

time_t t;
srand((int)time(&t) % getpid());
Run Code Online (Sandbox Code Playgroud)

e0k*_*e0k 5

您正在使用当前时间为随机数生成器播种.这是所有孩子的同一时间.您正在分叉子进程,它们正在并行检查时钟.并行性的全部意义在于同时做多个事情.

来自男人time():

time()返回自Epoch,1970-01-01 00:00:00 +0000(UTC)以来的秒数.

请注意,这也是在几秒钟内.第二个是运行过程的很长时间.即使你反复尝试(不是并行),两个进程很可能会要求时间,并得到相同的结果.

设计一种更好的方法,根据每个进程独有的内容为随机数生成器播种.例如,您可以将子进程ID添加到种子(getpid()而不是pid).