Take k elements at random from a stream of unknown or infinite or unknown length n in O(n)
class ReserviorSampling<T> { private int samplesReadSoFar = 0; private Random r = new Random(); public T[] Samples; public int SamplesWanted { get; private set; } public ReserviorSampling(int samplesWanted) { this.Samples = new T[samplesWanted]; this.SamplesWanted = samplesWanted; } public void Add(T sample) { if (samplesReadSoFar < this.SamplesWanted) { this.Samples[this.samplesReadSoFar] = sample; } else if (r.NextDouble() < (this.SamplesWanted / (double) this.samplesReadSoFar)) { this.Samples[r.Next(this.SamplesWanted)] = sample; } this.samplesReadSoFar++; } }