Knuth's algorithm S: Difference between revisions

Line 1,175:
Output:
<pre>29975 30028 30246 30056 30004 29983 29836 29967 29924 29981</pre>
 
=={{header|Phix}}==
{{trans|C}}
Phix does not support closures, but they are easy enough to emulate using {routine_id,environment}.<br>
Obviously the direct call (as commented out) is inevitably going to be marginally faster, and<br>
of course an s_of_n() that operated directly on local vars rather than elements of env, would be faster still.<br>
Not that a mere 100,000 samples takes any method more than a tiny fraction of a second, you understand.
<lang Phix>enum RID, I, SAMPLE
 
function s_of_n(sequence env, integer item)
integer i = env[I] + 1,
n = length(env[SAMPLE])
env[I] = i
if i<=n then
env[SAMPLE][i] = item
elsif n/i>rnd() then
env[SAMPLE][rand(n)] = item
end if
return env
end function
 
function s_of_n_creator(int n)
return {routine_id("s_of_n"),0,repeat(0,n)}
end function
 
function invoke(sequence env, args)
env = call_func(env[RID],prepend(args,env))
return env
end function
 
function test(integer n, sequence items)
sequence env = s_of_n_creator(n)
for i=1 to length(items) do
-- env = s_of_n(env,items[i])
env = invoke(env, {items[i]})
end for
return env[SAMPLE]
end function
procedure main()
sequence items_set = tagset(9,0)
sequence frequencies = repeat(0,length(items_set))
for i=1 to 100000 do
sequence res = test(3, items_set)
for j=1 to length(res) do
frequencies[res[j]+1] += 1
end for
end for
?frequencies
end procedure
main()</lang>
{{out}}
<pre>
{29631,30097,29737,30252,29774,30147,29901,30042,30204,30215}
</pre>
 
=={{header|PHP}}==
7,805

edits