15 #include "absl/random/discrete_distribution.h"
19 namespace random_internal {
24 std::vector<double>* probabilities) {
26 assert(probabilities);
27 assert(!probabilities->empty());
32 if (std::fabs(
sum - 1.0) > 1
e-6) {
35 for (
double& item : *probabilities) {
51 const size_t n = probabilities->size();
52 std::vector<std::pair<double, size_t>> q;
55 std::vector<size_t> over;
56 std::vector<size_t> under;
58 for (
const double item : *probabilities) {
60 const double v = item *
n;
63 under.push_back(
idx++);
65 over.push_back(
idx++);
68 while (!over.empty() && !under.empty()) {
69 auto lo = under.back();
71 auto hi = over.back();
75 const double r = q[hi].first - (1.0 - q[lo].first);
90 for (
auto i : under) {