RosettaCodeData/Task/Knuths-algorithm-S/D/knuths-algorithm-s-2.d

31 lines
766 B
D
Raw Permalink Normal View History

2013-04-10 21:29:02 -07:00
import std.stdio, std.random, std.algorithm;
2013-10-27 22:24:23 +00:00
struct SOfN(size_t n) {
2013-04-10 21:29:02 -07:00
size_t i;
int[n] sample = void;
2013-10-27 22:24:23 +00:00
int[] next(in size_t item, ref Xorshift rng) {
2013-04-10 21:29:02 -07:00
i++;
if (i <= n)
sample[i - 1] = item;
2015-02-20 00:35:01 -05:00
else if (rng.uniform01 < (double(n) / i))
2013-04-10 21:29:02 -07:00
sample[uniform(0, n, rng)] = item;
return sample[0 .. min(i, $)];
}
}
void main() {
enum nRuns = 100_000;
size_t[10] bin;
2013-10-27 22:24:23 +00:00
auto rng = Xorshift(0);
2013-04-10 21:29:02 -07:00
2013-10-27 22:24:23 +00:00
foreach (immutable trial; 0 .. nRuns) {
SOfN!3 sofn;
foreach (immutable item; 0 .. bin.length - 1)
sofn.next(item, rng);
foreach (immutable s; sofn.next(bin.length - 1, rng))
2013-04-10 21:29:02 -07:00
bin[s]++;
}
writefln("Item counts for %d runs:\n%s", nRuns, bin);
}