【问题标题】:Random number between forked processes is the same分叉进程之间的随机数相同
【发布时间】:2012-11-18 02:51:00
【问题描述】:

我正在从一个管理器进程中分叉多个进程。然后我想为这些分叉的进程创建一个随机端口号来监听。但是,当我随机播种并获得一个随机数时,我会在三个进程之间获得相同的数字。例如:

经理:

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

我曾尝试在 manager 中播种,然后在该过程中尝试 rand,但是当我可以 rand 时,我仍然遇到相同的问题。除了时间之外,我可以播种任何东西,并且仍然可以获得良好的随机结果。

【问题讨论】:

  • 尝试时间加进程号。
  • 这是个好主意。我想接受它,但这是一个评论。如果您需要代表,请将其添加为答案,我会接受。

标签: c++ random fork srand


【解决方案1】:

由于每个进程的时间都相同,因此您需要另一个保证在进程之间不同的输入。进程号适用于此。通过将进程号添加到时间来组合两者。

【讨论】:

    【解决方案2】:

    使用(pid % RAND_MAX) ^ WHATEVER 做种子——这将保证每个进程都有不同的种子。

    您可以将WHATEVER 定义为一个特定的值,或者如果您想要更少的可预测性,则可以定义(time(NULL) % RAND_MAX)

    【讨论】:

      猜你喜欢
      • 2020-01-26
      • 2017-06-04
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多