public class ReservoirSample
Performs a simple random sample using an in-memory reservoir to produce
a uniformly random sample of a given size.
This is similar to SimpleRandomSample, however it is guaranteed to produce
a sample of the given size. This comes at the cost of scalability.
SimpleRandomSample produces a sample of the desired size with likelihood of 99.99%,
while using less internal storage. ReservoirSample on the other hand uses internal storage
with size equaling the desired sample to guarantee the exact sample size.
This algebraic implementation is backed by a heap and maintains the original roll in order
to compensate for skew.