Back to all solutions

#528 - Random Pick with Weight

Problem Description

You are given a 0-indexed array of positive integers w where w[i] describes the weight of the ith index.

You need to implement the function pickIndex(), which randomly picks an index in the range [0, w.length - 1] (inclusive) and returns it. The probability of picking an index i is w[i] / sum(w).

For example, if w = [1, 3], the probability of picking index 0 is 1 / (1 + 3) = 0.25 (i.e., 25%), and the probability of picking index 1 is 3 / (1 + 3) = 0.75 (i.e., 75%).

Solution

/**
 * @param {number[]} w
 */
var Solution = function(w) {
  this.sums = [];
  let sum = 0;
  for (const weight of w) {
    sum += weight;
    this.sums.push(sum);
  }
  this.total = sum;
};

/**
 * @return {number}
 */
Solution.prototype.pickIndex = function() {
  const target = Math.random() * this.total;
  let left = 0;
  let right = this.sums.length - 1;
  while (left < right) {
    const mid = Math.floor((left + right) / 2);
    if (this.sums[mid] <= target) {
      left = mid + 1;
    } else {
      right = mid;
    }
  }
  return left;
};