2011-12-24 92 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

相關問題