Knuth's algorithm S: Difference between revisions

Updated D code
(Updated D code)
Line 53:
int[] sample;
int i;
typeof(sample)auto s_of_n(in int item) {
i++;
if (i <= n) {
// Keep first n items
sample ~= item;
} else if (uniform(0.0, 1.0) < (cast(double)n / i)) {
// Keep item
sample = remove(sample, uniform(0, n));
sample ~= item;
Line 78 ⟶ 76:
}
 
enum nruns = 1_000_000100_000;
foreach (trial; 0 .. nruns) {
auto s_of_n2 = s_of_n_creator(3);
Line 88 ⟶ 86:
}
writefln("\nTest item frequencies for %d runs:", nruns);
foreach (i, d; bin)
writeflnwrite(" %d:, %d", i, d");
}</lang>
Example output:
Line 96 ⟶ 94:
Item: 1 -> sample: [0, 1]
Item: 2 -> sample: [0, 1, 2]
Item: 3 -> sample: [0, 1, 2, 3]
Item: 4 -> sample: [01, 13, 4]
Item: 5 -> sample: [01, 13, 4]
Item: 6 -> sample: [1, 43, 64]
Item: 7 -> sample: [1, 63, 7]
Item: 8 -> sample: [61, 7, 8]
Item: 9 -> sample: [71, 87, 98]
 
Test item frequencies for 1000000100000 runs:
29926 30033 30145 30172 29882 30104 29773 30071 29858 30036</pre>
0: 300033
1: 299914
2: 299505
3: 300033
4: 299704
5: 299893
6: 299871
7: 300297
8: 300292
9: 300458</pre>
 
=={{header|Go}}==
Anonymous user