utils: Reimplement and type in-random.
This commit is contained in:
parent
b36d8adaa4
commit
87c80bb6ef
3 changed files with 62 additions and 50 deletions
3
info.rkt
3
info.rkt
|
@ -6,7 +6,8 @@
|
||||||
"rackunit-typed"
|
"rackunit-typed"
|
||||||
"typed-graph"
|
"typed-graph"
|
||||||
"typed-racket-lib"
|
"typed-racket-lib"
|
||||||
"typed-compose"))
|
"typed-compose"
|
||||||
|
"typed-racket-stream"))
|
||||||
(define build-deps '("racket-doc"
|
(define build-deps '("racket-doc"
|
||||||
"typed-racket-doc"
|
"typed-racket-doc"
|
||||||
"sandbox-lib"
|
"sandbox-lib"
|
||||||
|
|
|
@ -400,6 +400,33 @@ a couple conversions.
|
||||||
(lists-transpose '((a b) (1 2 3) (#t)))
|
(lists-transpose '((a b) (1 2 3) (#t)))
|
||||||
]}
|
]}
|
||||||
|
|
||||||
|
@defproc*[([(in-random) (Sequenceof Flonum)]
|
||||||
|
[(in-random [k Integer]) (Sequenceof Nonnegative-Fixnum)]
|
||||||
|
[(in-random [min Integer] [max Integer]) (Sequenceof Nonnegative-Fixnum)])]{
|
||||||
|
|
||||||
|
Generates a stream of (inexact) random numbers. The meaning of the arguments
|
||||||
|
is the same as for the function @racket[random]:
|
||||||
|
|
||||||
|
@itemlist[
|
||||||
|
|
||||||
|
@item{@racket[(in-random)] — a stream of random inexact numbers between
|
||||||
|
0 and 1,}
|
||||||
|
|
||||||
|
@item{@racket[(in-random k)] — a stream of random exact integers in the range
|
||||||
|
@racket[0] to @racket[k]-1.}
|
||||||
|
|
||||||
|
@item{@racket[(in-random min max)] — a stream of random exact integers the
|
||||||
|
range @racket[min] to @racket[max]-1.}
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
@examples[#:eval utils-evaluator
|
||||||
|
(require typed/racket/stream)
|
||||||
|
(stream->list (stream-take (in-random) 5))
|
||||||
|
(stream->list (stream-take (in-random 10) 5))
|
||||||
|
(stream->list (stream-take (in-random 5 10) 5))
|
||||||
|
]}
|
||||||
|
|
||||||
@section{Functions and procedures}
|
@section{Functions and procedures}
|
||||||
|
|
||||||
@section{Randomness}
|
@section{Randomness}
|
||||||
|
|
82
utils.rkt
82
utils.rkt
|
@ -11,7 +11,7 @@
|
||||||
;;; Typed section.
|
;;; Typed section.
|
||||||
|
|
||||||
(module typed typed/racket
|
(module typed typed/racket
|
||||||
(require typed/graph typed/rackunit typed-compose
|
(require typed/graph typed/rackunit typed-compose typed/racket/stream
|
||||||
(for-syntax syntax/parse racket/list))
|
(for-syntax syntax/parse racket/list))
|
||||||
|
|
||||||
(provide
|
(provide
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
list-sets->list-strings pretty-print-set pretty-print-set-sets
|
list-sets->list-strings pretty-print-set pretty-print-set-sets
|
||||||
update-vertices/unweighted update-graph dotit collect-by-key
|
update-vertices/unweighted update-graph dotit collect-by-key
|
||||||
collect-by-key/sets ht-values/list->set hash->list/ordered
|
collect-by-key/sets ht-values/list->set hash->list/ordered
|
||||||
multi-split-at lists-transpose)
|
multi-split-at lists-transpose in-random)
|
||||||
|
|
||||||
(define-type Variable Symbol)
|
(define-type Variable Symbol)
|
||||||
(define-type (VariableMapping A) (Immutable-HashTable Variable A))
|
(define-type (VariableMapping A) (Immutable-HashTable Variable A))
|
||||||
|
@ -454,6 +454,35 @@
|
||||||
(module+ test
|
(module+ test
|
||||||
(test-case "lists-transpose"
|
(test-case "lists-transpose"
|
||||||
(check-equal? (lists-transpose '((1 2) (a b))) '((1 a) (2 b)))))
|
(check-equal? (lists-transpose '((1 2) (a b))) '((1 a) (2 b)))))
|
||||||
|
|
||||||
|
(: in-random (case->
|
||||||
|
(-> (Sequenceof Flonum))
|
||||||
|
(-> Integer (Sequenceof Nonnegative-Fixnum))
|
||||||
|
(-> Integer Integer (Sequenceof Nonnegative-Fixnum))))
|
||||||
|
(define in-random
|
||||||
|
(case-lambda
|
||||||
|
[() (stream-cons (random) (in-random))]
|
||||||
|
[(k) (stream-cons (random k) (in-random k))]
|
||||||
|
[(min max) (stream-cons (random min max) (in-random min max))]))
|
||||||
|
|
||||||
|
(module+ test
|
||||||
|
(test-case "in-random"
|
||||||
|
(random-seed 1)
|
||||||
|
(check-equal? (stream->list (stream-take (in-random 100) 10))
|
||||||
|
'(50 84 10 99 94 88 43 41 63 50))
|
||||||
|
(check-equal? (stream->list (stream-take (in-random 50 100) 10))
|
||||||
|
'(57 98 82 83 61 53 73 82 50 80))
|
||||||
|
(check-equal? (stream->list (stream-take (in-random) 10))
|
||||||
|
'(0.2718099186980313
|
||||||
|
0.7319496826374751
|
||||||
|
0.17365244033739616
|
||||||
|
0.5593031443038616
|
||||||
|
0.3345256691289459
|
||||||
|
0.9845704615094365
|
||||||
|
0.05753824253751768
|
||||||
|
0.22552976312818723
|
||||||
|
0.21646500425988832
|
||||||
|
0.15188352823997242))))
|
||||||
)
|
)
|
||||||
|
|
||||||
(require 'typed)
|
(require 'typed)
|
||||||
|
@ -464,17 +493,13 @@
|
||||||
list-sets->list-strings pretty-print-set pretty-print-set-sets
|
list-sets->list-strings pretty-print-set pretty-print-set-sets
|
||||||
update-vertices/unweighted update-graph dotit collect-by-key
|
update-vertices/unweighted update-graph dotit collect-by-key
|
||||||
collect-by-key/sets ht-values/list->set hash->list/ordered
|
collect-by-key/sets ht-values/list->set hash->list/ordered
|
||||||
multi-split-at lists-transpose)
|
multi-split-at lists-transpose in-random)
|
||||||
|
|
||||||
;;; Untyped section.
|
;;; Untyped section.
|
||||||
|
|
||||||
(provide
|
(provide
|
||||||
;; Functions
|
;; Functions
|
||||||
(contract-out [in-random (case-> (-> (stream/c (and/c real? inexact? (>/c 0) (</c 1))))
|
(contract-out [cartesian-product/stream (->* () #:rest (listof stream?) stream?)]
|
||||||
(-> (integer-in 1 4294967087) (stream/c exact-nonnegative-integer?))
|
|
||||||
(-> exact-integer? (integer-in 1 4294967087)
|
|
||||||
(stream/c exact-nonnegative-integer?)))]
|
|
||||||
[cartesian-product/stream (->* () #:rest (listof stream?) stream?)]
|
|
||||||
[boolean-power (-> number? (listof (listof boolean?)))]
|
[boolean-power (-> number? (listof (listof boolean?)))]
|
||||||
[boolean-power/stream (-> number? (stream/c (listof boolean?)))]
|
[boolean-power/stream (-> number? (stream/c (listof boolean?)))]
|
||||||
[any->01 (-> any/c (or/c 0 1))]
|
[any->01 (-> any/c (or/c 0 1))]
|
||||||
|
@ -499,47 +524,6 @@
|
||||||
(cons/c key-contract val-contract)))
|
(cons/c key-contract val-contract)))
|
||||||
|
|
||||||
|
|
||||||
;;; ==========
|
|
||||||
;;; 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))]))
|
|
||||||
|
|
||||||
(module+ test
|
|
||||||
(test-case "in-random"
|
|
||||||
(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))))
|
|
||||||
|
|
||||||
|
|
||||||
;;; ===========================
|
;;; ===========================
|
||||||
;;; Additional stream utilities
|
;;; Additional stream utilities
|
||||||
;;; ===========================
|
;;; ===========================
|
||||||
|
|
Loading…
Reference in a new issue