    convenience of the framework (and subject to change!)
    If you want to explicitly control the distribution, use one of the
    distribution fns, e.g. uniform, geometric, etc."
-  ([] (unsigned-long Long/MAX_VALUE))
-  ([upper] {:pre [(pos? upper)]}
-     (one-of
-       (uniform 0 (min 3 upper))
-       (uniform 0 upper))))
-
-(defn ^byte byte
+  (^long [] (unsigned-long Long/MAX_VALUE))
+  (^long [upper] {:pre [(pos? upper)]}
+         (one-of
+          (uniform 0 (min 3 upper))
+          (uniform 0 upper))))
+
+(defn byte
   "Returns a random long in the byte range."
-  []
+  ^long []
   (uniform Byte/MIN_VALUE (inc (core/int Byte/MAX_VALUE))))
 
-(defn ^bool bool
+(defn bool
   "Returns a random bool."
   []
   (< (.nextDouble *rnd*) 0.5))


(defn geometric
  "Geometric distribution with mean 1/p."
  [p]
  (core/long (Math/ceil (/ (Math/log (.nextDouble *rnd*))
                           (Math/log (- 1.0 p))))))

(defn uniform
  "Uniform distribution from lo (inclusive) to high (exclusive).
   Defaults to range of Java long."
  ([] (.nextLong *rnd*))
  ([lo hi] {:pre [(< lo hi)]}
     (clojure.core/long (Math/floor (+ lo (* (.nextDouble *rnd*) (- hi lo)))))))

(defn ^float float
  "Generate a float."
  []
  (Float/intBitsToFloat (.nextInt *rnd*)))

(defn ^double double
  "Generate a double."
  []
  (.nextDouble *rnd*))

(defn rand-nth

   of the framework (and subject to change!)
   If you want to explicitly control the distribution, use one of the
   distribution fns, e.g. uniform, geometric, etc."
  ^long []
  (one-of
   (uniform -2 3)
   uniform))
