在子进程中生成randoms

时间:2015-11-22 17:07:18

标签: c multithreading pthreads fork

在下面的代码中,我做了一堆forks,每个子节点生成一个随机值,但是当我执行代码时,randomvalue在所有子节点中是相同的。为什么会发生这种情况,我该如何解决?

我希望每个孩子都有不同的随机值。

for (i=0; i<n; i++) {
        ret = fork();
        if (ret == 0) {
            /* child process*/

                    read(descriptor_fitxer[i][0], missatge, 50);
                    randomvalue = rand() % 50;
                    printf("Random is %d",randomvalue)
                    exit(0);


            }else{
            /*dad process*/
             wait(&st);}

输出:

Random is 31
Random is 31
Random is 31
Random is 31
Random is 31
Random is 31
Random is 31
Random is 31
Random is 31
Random is 31

2 个答案:

答案 0 :(得分:2)

你在哪里以及如何使用srand(); 尝试像这样修改孩子的代码

            read(descriptor_fitxer[i][0], missatge, 50);
            srand(time(NULL)+i);
            randomvalue = rand() % 50;
            printf("Random is %d",randomvalue)
            exit(0);

还要确保#include <time.h>

答案 1 :(得分:1)

您需要使用srand()为伪随机数生成器设定种子。 添加

srand((unsigned int)(time(0) + i*i));

在致电rand()之前。

通常情况下,您只需拨打srand()一次即可播种。但是如果你在循环之前只播种一次,那么rand()将是相同的数字序列(这就是rand的工作方式)。因此,必须在每个过程中播种。

调用srand((unsigned int)(time(0)));内部循环可能仍然会遇到相同的问题,因为循环可以足够快地运行以获得相同的种子。所以我使用i*i以防万一。