在下面的代码中,我做了一堆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
答案 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
以防万一。