rand-int
的当前源代码如下(省略)
(defn rand-int [n] (int (rand n)))
但这意味着它可以接受一个大于Integer/MAX_VALUE的参数,并随机抛出溢出异常
(rand-int (* Integer/MAX_VALUE 2.0))
;; => Execution error (ArithmeticException) at java.lang.Math/toIntExact (Math.java:1135).
;; integer overflow
(rand-int (* Integer/MAX_VALUE 2.0))
;; => 1536421981
等等。
我可以看出传递一个浮点数或双精度数对于“加权”范围可能很有用
(/ (reduce + 0 (map (fn [_] (rand-int 2.5)) (range 1e8)))
1e8)
;; => 0.79993543
(/ (reduce + 0 (map (fn [_] (rand-int 2)) (range 1e8)))
1e8)
;; => 0.49998904
但说实在的,我认为这对许多用户来说可能并不明显。
因此,如果您想允许这种行为,源代码可能如下所示
(defn rand-int [n] (int n) (int (rand n)))
如果不这样做,则可能如下所示
(defn rand-int [n] (int (rand (int n))))
但就目前而言,我们没有将其转换为整数,甚至没有检查输入是否在Integer范围内,这导致随机抛出溢出异常。而随机异常似乎对名为rand-int
的函数来说并不是一个好事情。