2011-12-24 83 views
10
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main() { 
    int i =10; 
    /* initialize random seed: */ 
    srand(time(NULL)); 
    while(i--){ 
     if(fork()==0){ 
      /* initialize random seed here does not make a difference: 
      srand(time(NULL)); 
      */ 
      printf("%d : %d\n",i,rand()); 
      return; 
     } 
    } 
    return (EXIT_SUCCESS); 
} 

打印相同(每次运行不同)数量10次 - 预计? 我具有更复杂的一段代码,其中每个叉状过程反过来运行 - 没有差别为什么rand()在fork之后不是那么随机的?

+0

非常感谢你的答案 - 现在清楚:) – 2011-12-24 12:21:55

回答

18

输出必须是相同的。如果两个进程分别播种同一种子的随机数,并且每次呼叫rand一次,它们必须得到相同的结果。这就是拥有种子的关键。您的所有进程的调用srand使用相同的种子(因为你只叫srand一次),他们都称rand一次,所以它们必须得到相同的结果。

取消对srand不会有所作为,因为除非秒数发生了变化,他们还是会给予相同的种子。你可以这样做:

srand(time(NULL)^(getpid()<<16)); 
5

rand()函数是伪随机数发生器。这意味着所生成数字的序列是确定性的,仅取决于所提供的种子。

因为你分了10次同样的过程,每个孩子的随机数发生器的状态是一样的。当您下次拨打rand()时,您将获得相同的价值。

通过调用srand(time(NULL))子进程里面,你是潜在帮助但time()粒度仅为1秒,因此,所有你的孩子可能会开始在同一秒内。以相同的值播种会产生相同的伪随机序列。

,你可以尝试用取决于孩子数的值播种:

srand(time(NULL) - i*2); 

(我在事件中使用i*2叉状循环中time()垫款1秒。)

+0

总体而言是个好主意,但它会是明智的,纳入一个更为显著时尚的孩子数量。 '时间(空)+ 100 *我'或类似的东西,以确保一个或两个秒的差异不会影响种子。 – sarnold 2011-12-24 06:53:48

+0

好点,我喜欢David Schwartz关于使用孩子pid的想法。 – 2011-12-24 06:56:45

+0

是的,我真的很喜欢他怎么在_high_中混合它,但是使用克隆(2)而不是fork(2)的应用程序,它们都可能具有相同的'pid'但是不同的“我”的值。轻微的细微差别,可能永远不会对任何人重要... – sarnold 2011-12-24 06:57:49

0

原因因为所有程序都使用相同的值(在while循环之外)播种。一旦你分出新节目或者两者都会产生相同的序列,你应该再播种一次。

5

如果您的代码运行得足够快,srand()可能会针对每个分支完全相同的时间播种。 time()仅每秒更改一次。

0

当您制作子进程时,您不会再次进行此操作。随机数发生器的状态完全相同。

即使您再次给您的孩子播种,您也会以+/- 1秒的粒度播种时间。当你分叉时,这一切都发生在不到一秒钟。

尝试使用不同且更随机的东西播种。

2

,即使添加srand(time(NULL));(该if块,你有评论里面的线)循环中的原因是没有发挥作用是因为现代计算机可以执行整块非常快,并在几秒钟time计数。从手册页:

时间()返回的时间为自纪元秒数...

如果您在while循环添加sleep(1);if语句之后并取消srand调用,结果将会不同,因为time现在会返回一个不同的值,因为第二个已经过去了。

然而,使用不同的种子值会更合适,而不是等待。类似于i将是一个好主意,因为它对循环的每次迭代都是唯一的。

0

这个问题解决了:

srand48((long int)time(NULL)); 
i= (lrand48()/rand()+1) % 123 

我没有用叉子测试,但里面调用100次它的工作原理。

种子与PID号码。这是一个小问题,但很难解决问题。

这在一些页面:“这个工作函数srand(时间(0)+ GETPID());但我不得不0的情况即子进程中调用这个”。

+0

我不明白你的英文 – 2014-12-16 22:07:08

相关问题