Consolidated response before finalization John Cowan (10 Jul 2020 03:23 UTC)
Re: Consolidated response before finalization Bradley Lucier (10 Jul 2020 18:29 UTC)
Re: Consolidated response before finalization Bradley Lucier (10 Jul 2020 20:33 UTC)
Re: Consolidated response before finalization Arvydas Silanskas (10 Jul 2020 20:49 UTC)
Which notation is better? Bradley Lucier (10 Jul 2020 20:55 UTC)
Re: Consolidated response before finalization Linas Vepstas (10 Jul 2020 18:36 UTC)
Re: Consolidated response before finalization Linas Vepstas (10 Jul 2020 18:46 UTC)
Re: Consolidated response before finalization Arvydas Silanskas (10 Jul 2020 19:38 UTC)
Re: Consolidated response before finalization Linas Vepstas (10 Jul 2020 20:12 UTC)

Re: Consolidated response before finalization Bradley Lucier 10 Jul 2020 18:29 UTC

On 7/9/20 11:23 PM, John Cowan wrote:
> Given the existing SRFI 27 facilities (which are included by reference
> in this SRFI), I don't think I'm going to add the round-robin use of
> different sources.  You could create a circular generator to provide
> them, just as one possible approach.
>
> I said I would put the gamma and Zipf distributions in if someone
> stepped up to write the code, but no one did.  A supplementary SRFI
> could easily add new distributions later, as they are all basically
> independent.
>
> So we're done here for now.

John:

I fear I have been distracted during the period of this SRFI.  These are
distracting times.

I'm not sure what you mean by "round-robin use of different sources."  I
had previously suggested the routine random-source-generator (see test
example below).

I think this is an important routine if you're going to do a SRFI that
combines random variable generation with generators.

I've done various discrete simulations before, and I'd like to use this
SRFI if I need to do some again.  I downloaded the current sources and
made up this little test file that mimics what I might typically need
for a simulation:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define current-random-source (make-parameter default-random-source))

;;; Carefully step through the independent substreams of the i'th
;;; stream of random numbers.

(define (random-source-generator i)
   (let ((j 0))
     (lambda ()
       (let ((new-source (make-random-source))) ;; deterministic
         (random-source-pseudo-randomize! new-source i j)
         (set! j (+ j 1))
         new-source))))

(define (make-exponential-generator mean)
   (let ((rand-real-proc (random-source-make-reals
(current-random-source))))
    (lambda ()
      (- (* mean (log (rand-real-proc)))))))

(define-syntax with-random-source
   (syntax-rules ()
     ((_ random-source proc arg ...)
      (begin
        (unless (random-source? random-source)
          (error "expected random source"))
        (parameterize ((current-random-source random-source))
                      (proc arg ...))))))

;;; Set the number of this experimental run.

(define experiment 0) ;; then 1, 2, ... in later runs.

;;; define random sources for this experiment.

(define sources (random-source-generator experiment))

;;; define N servers with exponentially distributed service
;;; times with given mean.

(define (make-servers N mean)
   (let ((result (make-vector N)))
     (do ((i 0 (fx+ i 1)))
         ((fx= i N) result)
       (vector-set! result
                    i
                    (with-random-source (sources)
                                        (make-exponential-generator
mean))))))

(define servers (make-servers 5 1.0))

(pretty-print (vector-map (lambda (arg) (arg)) servers))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

I expected that servers would be a vector of generators, each associated
with my carefully controlled random source (and perhaps each with its
own mean, but not in this example), that I could call when needed.

But it appears that the macro with-random-source actually calls the
generator once, so servers is a vector of reals.

How do I get what I need?

Brad