2012-11-18 24 views
1

我從管理進程派生多個進程。然後我想爲這些分叉的進程創建一個隨機端口號來進行監聽。然而,當我種子隨機,並獲得一個隨機數,我得到了三個進程之間相同的數字。例如:分叉進程之間的隨機數是相同的

經理:

int main(){ 
for(int i = 0; i < rCount; i++){ 
    pid_t pid = fork(); 
    if (pid == 0) {// child 
     execl(ROUTERLOCATION,"",NULL); //create router process 
    } 
    else { // parent 
    } 
    } 
} 

路由器:

int main(){ 
    randomPort(); 
} 
void randomPort(){ 
    srand(time(NULL)); 
    int host_port = rand() % 99999 + 11111; 
    cout << houst_port << endl; 
} 

我試圖播種的經理,然後在過程中努力蘭特,但我仍然有獲得同樣的問題我可以隨機發送相同的數字。除了時間之外,我可以種下任何東西,並且仍然可以得到好的隨機結果。

+1

嘗試時間加過程號。 –

+0

這是個好主意。我想接受它,但它是一個評論。如果你想要代表,將其添加爲答案,我會接受。 – nook

回答

1

由於每個過程的時間都是相同的,所以您需要另外一個保證在過程之間不同的輸入。進程號碼適用於此。通過將進程號添加到時間來組合這兩者。

1

種子與(pid % RAND_MAX)^WHATEVER - 這將保證每個過程不同的種子。

您可以將WHATEVER定義爲特定值,或者如果您想要的可預測性更低,則可以將其定義爲(time(NULL) % RAND_MAX)