triangularSample function

List<double> triangularSample(
  1. int sampleSize,
  2. num xMin,
  3. num xMax, {
  4. int? seed,
})

Returns a random sample following a symmetric triangular distribution with non-zero support over the range xMin ... xMax.

Throws an error of type ErrorOfType<InvalidFunctionParameter> if xMin >= xMax.

Implementation

List<double> triangularSample(
  int sampleSize,
  num xMin,
  num xMax, {
  int? seed,
}) {
  if (xMin >= xMax) {
    throw ErrorOfType<InvalidFunctionParameter>(
      message: 'Error in function '
          'triangularSample($sampleSize, $xMin, $xMax, seed: $seed)',
      invalidState: 'min: $xMin >= max: $xMax',
      expectedState: 'xMmin < xMax',
    );
  }

  double invCdf(num p, num min, num max) {
    final range = max - min;
    if (p < 0.5) {
      return min + range * sqrt(p / 2);
    } else {
      return max - range * sqrt((1.0 - p) / 2);
    }
  }

  final random = Random(seed);
  return List<double>.generate(
      sampleSize, (_) => invCdf(random.nextDouble(), xMin, xMax));
}