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()