You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

35 lines
1.0 KiB

(in-package #:cl-rng)
(defun crandom (&key (limit 1.0) (precision 1) (transform nil))
(let ((transform (or transform #'identity)))
(multiple-value-bind (result ok) (cl-rng-ffi:ffi-sample)
(and ok
(funcall transform
(* limit
(if (< precision 2)
result
(/ (apply #'+ (mapcan #'(lambda (x)
(and (not (null x))
(list x)))
(loop for x from 0 below precision collect
(crandom))))
precision))))))))
(defun %crandom-vector (range &rest params)
(loop for x from 0 below (length range) collect
(setf (aref range x) (apply 'crandom params))))
(defun %crandom-list (range &rest params)
(setf (car range) (apply 'crandom params))
(unless (null (cdr range))
(cons (car range) (apply '%crandom-list (cons (cdr range) params)))))
(defun crandom-range (range &rest params)
(if (listp range)
(apply '%crandom-list (cons range params))
(apply '%crandom-vector (cons range params))))
(export 'crandom)
(export 'crandom-range)