在Common Lisp中如何生成[0…1.0]闭区间内的随机数
Common Lisp 生成包含1.0的[0,1]区间随机浮点数方案
首先你的理解完全正确:Common Lisp 标准明确规定,(random n) 接收正浮点数 n 时,返回的是左闭右开区间 [0, n) 内的浮点数,所以 (random 1.0) 永远不会返回 1.0。
你想到的先按所需精度生成整数、再做除法缩放的方案,本身就是Common Lisp社区广泛认可的标准实现方式,没有更通用的“官方内置方案”,原因是浮点数区间的均匀分布逻辑本身和使用场景需要的精度强绑定,标准无法给出不依赖业务需求的通用实现。
常用实现示例
你可以根据自己需要的精度灵活调整参数:
- 如果你需要小数点后6位精度,包含0.0和1.0端点,实现如下:
;; 生成0到1000000的整数(包含两端),除以1e6得到目标区间值 (/ (random 1000001) 1000000.0) - 如果你需要匹配当前使用的浮点数类型的最大精度,比如单精度浮点数,可以用对应精度的最大可表示整数调整:
;; 单精度浮点数场景下的全精度实现 (/ (random (1+ (expt 2 24))) (float (expt 2 24) 1.0f0))
注意事项
不建议使用「(random 1.0) 加极小epsilon」的实现方式,这种方式会破坏分布的均匀性,且1.0的出现概率不符合均匀分布的预期,只有整数缩放的方案能保证每个可取值的概率是均等的。
内容的提问来源于stack exchange,提问作者Dr Rama Lakshmanan
相关产品推荐
相关产品推荐

