(defgeneric generate-random-value (randomvar)) (defclass randomvar () ()) (defclass discrete-randomvar (randomvar) ()) (defclass discrete-finite-randomvar (discrete-randomvar) ;; store the integral of the distribution in the table ((table :initvar :table :reader randomvar-table))) (defun make-discrete-finite-randomvar (distribution) (let ((table (make-array (length distribution)))) (setf (aref table 0) (elt distribution 0)) (loop for elem in (cdr (coerce distribution 'list)) for i from 1 do (setf (aref table i) (+ (aref table (1- i)) elem))) (make-instance 'discrete-finite-randomvar :table table))) (defmethod generate-random-value ((var discrete-finite-randomvar)) (loop with uniform = (random 1.0) with table = (randomvar-table var) for x from 0 while (< (aref table x) uniform) finally return x)) (defclass discrete-infinite-randomvar (discrete-randomvar) ((fun :initvar :fun :reader randomavar-fun))) (defun make-discrete-infinite-randomvar (distribution) (make-instance 'discrete-infinite-randomvar :fun distribution)) (defmethod generate-random-value ((var discrete-infinite-randomvar)) ( (defclass continuous-randomvar (randomvar) ()) (defclass continuous-finite-randomvar (continuous-randomvar) ()) (defclass continuous-infinite-randomvar (continuous-randomvar) ())