randWeightedTake<T> static method

T randWeightedTake<T>(
  1. List<T> arr,
  2. List<double> weights
)

Implementation

static T randWeightedTake<T>(List<T> arr, List<double> weights) {
  final total = weights.reduce((a, b) => a + b);
  var roll = _rnd.nextDouble() * total;

  for (var i = 0; i < arr.length; i++) {
    roll -= weights[i];
    if (roll <= 0) {
      weights.removeAt(i);
      return arr.removeAt(i);
    }
  }

  weights.removeLast();
  return arr.removeLast();
}