1 ! Copyright (C) 2020 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors kernel math math.functions random sequences ;
6 : reservoir-sample-iteration ( iteration k obj sampled -- sampled' )
10 roll random roll dupd < [
17 TUPLE: reservoir-sampler iteration k sampled ;
18 : <reservoir-sampler> ( k -- sampler )
24 : reservoir-sample ( obj sampler -- )
25 [ sampled>> length ] [ k>> ] [ [ 1 + ] change-iteration -rot ] tri < [
28 [ ] [ iteration>> random dup ] [ k>> ] tri < [
29 swap sampled>> set-nth