请在 2024 Clojure 状态调查! 中分享你的看法。

欢迎!有关如何使用此服务的更多信息,请参阅 关于 页面。

+1投票
Java 互操作性
重新标记

查看以下 gist 以查看详细结果。

请注意,对于我来说使用互操作是可行的,
我处于一个运筹学用例中,其中随机值的消耗时间很重要。

但我不知道为什么 Clojure 不应提出一个更好的 rand-int 版本。

我怀疑(如果需要会进行检查),`nextInt` 版本可能更加均匀(从理论上讲,统计上更接近理论)。

PS:来自 Slack 上一个问题的重复项,clojure 频道。

2 答案

+3投票

已选择
 
最佳答案

为了绝对效率(或者至少不要让任何东西落在地板上),我认为为rand-int提供一个专门的变体是有意义的。我认为这可能是clojure 1.0的简单实现。这很可能简化了通过Math/random的隐式全局prng统一所有内容。然而,多年来,有人抱怨这种方法缺乏可播种性;常见的解决方案似乎是要么定义一个包含随机实例的dynvar,然后委托调用它,但这种做法会带来dynvar的查找成本。但你确实需要为rand-int引入一个专门的Random实例(这个很简单...只需关闭它即可)。

注意,如果你真的很关注性能,来自https://dsiutils.di.unimi.it/docs/it/unimi/dsi/util/XoRoShiRo128PlusRandom.html的PRNG在我的机器上比java.util.random快约2倍,而且还有更多专门的技巧,例如https://dragan.rocks/articles/19/Billion-random-numbers-blink-eye-Clojure(尽管这些示例需要被转换为整数,可能还需要一些流API包装,并且还需要引入额外的依赖项)。

0 投票
by
...