2

マネージャー プロセスから複数のプロセスをフォークしています。次に、これらのフォークされたプロセスがリッスンするためのランダムなポート番号を作成したいと思います。ただし、ランダムにシードして乱数を取得すると、3 つのプロセス間で同じ数が取得されます。例えば:

マネジャー:

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;
}

私はマネージャーでシードを試み、次にプロセスでランドを試みましたが、ランドできるときに同じ数を取得するという同じ問題がまだあります。時間以外でシードしても、ランダムな結果が得られますか?

4

2 に答える 2

1

時間はすべてのプロセスで同じになるため、プロセス間で異なることが保証されている別の入力が必要です。プロセス番号はこれに適しています。プロセス番号を時間に追加して、2 つを結合します。

于 2012-11-18T03:11:01.527 に答える
1

Seed with (pid % RAND_MAX) ^ WHATEVER-- これにより、プロセスごとに異なるシードが保証されます。

WHATEVER特定の値に定義すること(time(NULL) % RAND_MAX)も、予測可能性をさらに低くしたい場合も定義できます。

于 2012-11-18T02:59:17.317 に答える