[CM] variables for weights

Tiago Videira tiago.videira at gmail.com
Tue Mar 27 01:29:20 PDT 2012

So far the nifty function of Prof Taube has worked fine with numbers:

However it seems it can't handle variables in the place of weights.
How can I change that so I can use for instance the command
(setq z 30)
(gn-weight 2 '((a z) (b 5) (c 50)))

having defined z previously?

Basically i'm trying to achieve a function that can handle a list of
weighted probabilities, in which the weights can be variables.
Many thanks and Kind regards


(defun make-ptable (data)
  (let ((total (loop for d in data sum (second d)))
        (sum 0))
    ;; total holds sum of weights in data
    (loop for d in data
          for v = (first d)      ; outcome to return
          for w = (second d)     ; relative weight
          do (setq sum (+ sum w))
          ;; collect outcome and normalized probability
          collect (list v (/ sum total)))))

(defun pick-tbl (table)
  ;; return outcome in table according
  ;; to its weighted probability
  (let ((x (rnd2 0 1)))
    ;; x is uniform number < 1.
    (loop for d in table
          for p = (second d)
          when (< x p )   ; x in this segment.
          return (first d))))

(defun gn-weight (nb tbl)
(loop for i from 0 to (- nb 1)
      collect (pick-tbl (make-ptable tbl))))

More information about the Cmdist mailing list