2024 年 Clojure 状况调查! 分享您的想法。

欢迎!请参阅 关于 页面以获取更多关于它是如何工作的信息。

0
Clojure

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))))

但就目前的情况来看,我们没有将值强制转换为整数,甚至没有检查输入是否在整数范围内,这导致随机抛出溢出异常。随机异常在名为 rand-int 的函数中看起来像是不良的行为。

1 答案

0

被选中
 
最佳回答

针对该问题已创建 Jira 工单 https://clojure.atlassian.net/browse/CLJ-2812

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