diff --git a/utils-tests.rkt b/utils-tests.rkt index 1198428..c69fa25 100644 --- a/utils-tests.rkt +++ b/utils-tests.rkt @@ -129,3 +129,22 @@ (test-case "Functions" (check-true (procedure-fixed-arity? not)) (check-false (procedure-fixed-arity? +))) + +(test-case "Randomness" + (begin + (random-seed 0) + (check-equal? (stream->list (stream-take (in-random 100) 10)) + '(85 65 20 40 89 45 54 38 26 62)) + (check-equal? (stream->list (stream-take (in-random 50 100) 10)) + '(75 59 82 85 61 85 59 64 75 53)) + (check-equal? (stream->list (stream-take (in-random) 10)) + '(0.1656109603231493 + 0.9680391127132195 + 0.051518813640790355 + 0.755901955353936 + 0.5923534604277275 + 0.5513340634474264 + 0.7022057040731392 + 0.48375400938578744 + 0.7538961707172924 + 0.01828428516237329)))) diff --git a/utils.rkt b/utils.rkt index f286562..5bfd2bd 100644 --- a/utils.rkt +++ b/utils.rkt @@ -33,7 +33,11 @@ [collect-by-key/sets (-> (listof any/c) (listof any/c) (values (listof any/c) (listof (set/c any/c))))] [ht-values/list->set (-> (hash/c any/c (listof any/c)) (hash/c any/c (set/c any/c)))] - [procedure-fixed-arity? (-> procedure? boolean?)]) + [procedure-fixed-arity? (-> procedure? boolean?)] + [in-random (case-> (-> (stream/c (and/c real? inexact? (>/c 0) ( (integer-in 1 4294967087) (stream/c exact-nonnegative-integer?)) + (-> exact-integer? (integer-in 1 4294967087) + (stream/c exact-nonnegative-integer?)))]) ;; Contracts (contract-out [variable-mapping? contract?] [string-variable-mapping? contract?] @@ -329,3 +333,25 @@ (define (procedure-fixed-arity? func) (match (procedure-arity func) [(arity-at-least _) #f] [arity #t])) + + +;;; ========== +;;; Randomness +;;; ========== + +;;; Generates a stream of inexact random numbers. The meaning of the +;;; arguments is the same as for the function random: +;;; +;;; (in-randoms k) — a sequence of random exact integers in the range +;;; 0 to k-1. +;;; +;;; (in-randoms min max) — a sequence of random exact integers the +;;; range min to max-1. +;;; +;;; (in-randoms) — a sequence of random inexact numbers between +;;; 0 and 1. +(define in-random + (case-lambda + [() (for/stream ([i (in-naturals)]) (random))] + [(k) (for/stream ([i (in-naturals)]) (random k))] + [(min max) (for/stream ([i (in-naturals)]) (random min max))]))