jeudi 16 août 2018

What's a good way to seed a random number generator to work with forking?

Suppose I have a function generateId to generate random 64-bit integers. If I write generateId like this

uint64_t generateId() {
  static thread_local std::mt19937_64 rng{std::random_device{}()};
  return rng();
}

Then rng won't get reseeded after a fork. Running

int main() {
  std::cout << generateId() << "\n";
  if (fork() == 0) {
    std::cout << "child: " << generateId() << "\n";
  } else {
    std::cout << "parent: " << generateId() << "\n";
  }
  return 0;
}

Will print the same number for child and parent.

Is there a way I can write generateId so that it reseeds for new processes but still remains performant.




Aucun commentaire:

Enregistrer un commentaire