// Populates a filter with random values.
// Note: A filter with a small r_bits is difficult to fill.
static void populate(filter_t &filter, size_t insertion_tries = SIZE_MAX) {
  auto gen_fp = make_fp_generator(filter);
  while (!filter.full() && insertion_tries) {
    filter.insert(gen_fp());
    --insertion_tries;
  }
}
static auto make_insertion_decision_generator(const filter_t &filter) {
  using param_t = std::bernoulli_distribution::param_type;
  bernoulli_distribution dist;
  minstd_rand gen(3782348);

  return [&filter, gen = std::move(gen), dist ]() mutable {
    if (filter.empty())
      return true;
    if (filter.full())
      return false;
    const double load_factor = double(filter.size()) / filter.capacity();
    return dist(gen, param_t(1.0 - load_factor));
  };
}