Knuth's algorithm S: Difference between revisions

Added zkl
(Updated both D entries)
(Added zkl)
Line 1,285:
freq(8) = 30060
freq(9) = 29824
</pre>
 
=={{header|zkl}}==
<lang zkl>fcn s_of_n_creator(n){
fcn(item,ri,N,samples){
i:=ri.inc(); // 1,2,3,4,...
if(i<=N) samples.append(item);
else if ((0).random(i) < N) samples[(0).random(N)] = item;
samples
}.fp1(Ref(1),n,L())
}</lang>
One run:
<lang zkl>s3:=s_of_n_creator(3);
[0..9].pump(List,s3,"copy").println();</lang>
{{out}}
<pre>
L(L(0),L(0,1),L(0,1,2),L(0,1,2),L(0,4,2),L(5,4,2),L(5,6,2),L(5,6,2),L(5,6,2),L(9,6,2))
</pre>
100,000 runs:
<lang zkl>dist:=L(0,0,0,0,0,0,0,0,0,0);
do(0d100_000){
(0).pump(10,Void,s_of_n_creator(3)).apply2('wrap(n){dist[n]=dist[n]+1})
}
N:=dist.sum();
dist.apply('wrap(n){"%.2f%%".fmt(n.toFloat()/N*100)}).println();</lang>
{{out}}
<pre>
L("10.00%","9.98%","10.00%","9.99%","10.00%","9.98%","10.01%","10.04%","9.98%","10.02%")
</pre>
Anonymous user