diff --git a/pkgs/racket-doc/scribblings/reference/numbers.scrbl b/pkgs/racket-doc/scribblings/reference/numbers.scrbl index 28e2c7121c..664c1c3fdd 100644 --- a/pkgs/racket-doc/scribblings/reference/numbers.scrbl +++ b/pkgs/racket-doc/scribblings/reference/numbers.scrbl @@ -966,8 +966,7 @@ the @tt{RtlGenRand} system function. any/c]{ Returns a random element of the sequence. Like @racket[sequence-length], does -not terminate on infinite sequences, and extracts elements up to the returned -element. +not terminate on infinite sequences, and evaluates the entire sequence. @history[#:added "6.4"]} @@ -978,12 +977,13 @@ element. [#:replacement? replacement? any/c #t]) (listof any/c)]{ -Returns a list of @racket[n] elements of @racket[seq], picked at random. +Returns a list of @racket[n] elements of @racket[seq], picked at random, listed +in any order. If @racket[replacement?] is non-false, elements are drawn with replacement, which allows for duplicates. Like @racket[sequence-length], does not terminate on infinite sequences, and -extracts elements up to the returned element. +evaluates the entire sequence. @history[#:added "6.4"]} diff --git a/racket/collects/racket/random.rkt b/racket/collects/racket/random.rkt index 9dcf77c2c5..5d1c431e1f 100644 --- a/racket/collects/racket/random.rkt +++ b/racket/collects/racket/random.rkt @@ -25,8 +25,9 @@ (define (random-sample seq n [prng (current-pseudo-random-generator)] #:replacement? [replacement? #t]) ;; doing reservoir sampling, to do a single pass over the sequence - ;; (some sequences may not like multiple passes) + ;; (some sequences may not like multiple passes, e.g., ports) (cond + [(zero? n) '()] [(not replacement?) ;; Based on: http://rosettacode.org/wiki/Knuth's_algorithm_S#Racket (define not-there (gensym)) @@ -41,7 +42,7 @@ (unless (for/and ([s (in-vector samples)]) (not (eq? s not-there))) (raise-argument-error 'random-sample - "integer less than sequence length" + "integer less than or equal to sequence length" n)) (vector->list samples)] [else @@ -57,6 +58,6 @@ (vector-set! samples j elt)))])) (unless samples (raise-argument-error 'random-sample - "non-empty sequence" + "non-empty sequence for n>0" seq)) (vector->list samples)]))