Try to unfuck the random-range stuff for floats
author |
Steve Losh <steve@stevelosh.com> |
date |
Tue, 27 Dec 2016 00:15:55 -0500 |
parents |
18e71146fb25
|
children |
c3e4c4c8afa0
|
branches/tags |
(none) |
files |
losh.lisp |
Changes
--- a/losh.lisp Tue Dec 27 00:07:07 2016 -0500
+++ b/losh.lisp Tue Dec 27 00:15:55 2016 -0500
@@ -229,6 +229,14 @@
;;;; Random -------------------------------------------------------------------
+(defun-inline epsilon (val)
+ (etypecase val
+ (integer 1)
+ (short-float short-float-epsilon)
+ (long-float long-float-epsilon)
+ (single-float single-float-epsilon)
+ (double-float double-float-epsilon)))
+
(defun-inlineable randomp (&optional (chance 0.5))
"Return a random boolean with `chance` probability of `t`."
(< (random 1.0) chance))
@@ -260,11 +268,11 @@
(defun-inlineable random-range-inclusive (min max)
"Return a random number in [`min`, `max`]."
- (+ min (random (1+ (- max min)))))
+ (+ min (random (+ (- max min) (epsilon min)))))
(defun-inlineable random-range-exclusive (min max)
"Return a random number in (`min`, `max`)."
- (+ 1 min (random (- max min 1))))
+ (+ (epsilon min) min (random (- max min (epsilon min)))))
(defun random-around (value spread)
"Return a random number within `spread` of `value`."