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