在< nighttime="https://www.surveymonkey.com/r/clojure2024">2024年Clojure调查!中分享您的想法。

欢迎!有关如何使用本站的一些更多信息,请参阅关于页面。

0
Clojure

现在< code>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))))

但是,按照目前的情况,我们没有将其强制转换为整数,甚至没有检查输入是否在整数范围内,这可能会导致随机溢出异常。而随机异常似乎不是一个好事情,即使是对于称为< code>rand-int的功能来说也是如此。

1 个答案

0

被选中
 
最佳答案

已为跟踪此问题创建Jira工单https://clojure.atlassian.net/browse/CLJ-2812

 
感谢Jarrod。我期待看到核心团队的决定。
...