stratifiedSampleIndices function

List<int> stratifiedSampleIndices(
  1. List<Object?> strata,
  2. int perGroup, [
  3. Random? random
])

Stratified: strata gives group id per index; sample perGroup from each.

Implementation

List<int> stratifiedSampleIndices(List<Object?> strata, int perGroup, [Random? random]) {
  final Random r = random ?? Random();
  final Map<Object?, List<int>> groups = <Object?, List<int>>{};
  for (int i = 0; i < strata.length; i++) {
    groups.putIfAbsent(strata[i], () => []).add(i);
  }
  final List<int> out = [];
  for (final List<int> indices in groups.values) {
    indices.shuffle(r);
    for (int j = 0; j < perGroup && j < indices.length; j++) {
      out.add(indices[j]);
    }
  }
  return out;
}