作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 Common Lisp 伪随机数生成的理解是,(random 1.0)
将生成一个严格小于 1 的分数。我希望得到 1.0 以内的数字。这可能吗?我想我可以决定精度并生成整数并除以范围,但我想知道是否有更广泛接受的方法来做到这一点。谢谢。
最佳答案
如你所说,random
默认会生成[0,1)范围内的数,一般情况下(random x)
会生成[0,x]范围内的随机数).如果这些是实数并且分布真的是随机的,那么得到任何数字的概率都是零,所以这实际上与 [0,1] 没有什么不同。但它们不是实数:它们是 float ,因此获得任何特定值的概率更高,因为 [0,1] 中只有有限数量的 float 。
幸运的是,您可以准确地表达您想要的内容:CL 有一堆常量,其名称如 *-epsilon
被定义为,例如
(/= (+ 1.0f0 single-float-epsilon) 1.0f0)
并且 single-float-epsilon
是最小的 single-float
,这是正确的。
因此 (random (+ 1.0f0 single-float-epsilon))
将产生 [0,1] 范围内的随机单 float ,最终可能会变成 1.0f0
。你可以测试这个:
(defun tsit ()
(let ((f (+ 1.0f0 single-float-epsilon)))
(assert (/= f 1.0f0) (f) "oops")
(loop for i upfrom 1
for v = (random f)
when (= v 1.0f0)
return (values i v))))
对我来说
> (tsit)
12839205
1.0
如果您使用双 float ,则需要……相当长的时间……才能获得 1.0d0
(并记住使用 double-float-epsilon
)。
关于random - 如何在 Common Lisp 中生成 [0 ... 1.0] 中的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69703679/
我是一名优秀的程序员,十分优秀!