Skip to content

Instantly share code, notes, and snippets.

@9il
Created September 29, 2018 05:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 9il/1d60c0e117868797b283985db64748a3 to your computer and use it in GitHub Desktop.
Save 9il/1d60c0e117868797b283985db64748a3 to your computer and use it in GitHub Desktop.
/+dub.sdl:
dependency "mir-random" path="./"
+/
import mir.math.common;
import mir.ndslice.sorting;
import mir.random;
import mir.random.algorithm;
import mir.random.variable;
enum n = 30; // sample size
enum numTrials = 5_000;
enum double scale = 1;
enum double lambda = 1 / scale;
// quantile [0, 1) or [0, 1]
auto orderStat(double quantile)
{
auto r = cast(int) (quantile * n); //trunc down
if (r == n) r = n - 1;
return r;
}
auto cdf(double x)
{
// trivial for uniform(0, 1)
// return x;
// for exponential:
return 1-(exp(lambda * -x));
}
void main()
{
import std.stdio;
auto quantileFile = File("quantile.txt", "w");
auto quantileDiffFile = File("quantile-diff.txt", "w");
foreach(trialNum; 0 .. numTrials)
{
// auto sample = uniformVar(0.0, 1.0).randomSlice(n).field.sort;
auto sample = exponentialVar(scale).randomSlice(n).field.sort;
auto requestedQuantile = rand!double.fabs; // [0, 1)
auto k = orderStat(requestedQuantile);
auto estimatedQuantileValue = sample[k];
auto trueQuantile = cdf(estimatedQuantileValue);
quantileFile.writefln("%s %s", requestedQuantile, trueQuantile);
quantileDiffFile.writefln("%s %s", requestedQuantile,
trueQuantile - requestedQuantile);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment