gpt4 book ai didi

random - 如何在 Common Lisp 中生成 [0 ... 1.0] 中的随机数

转载 作者:行者123 更新时间:2023-12-04 22:34:18 25 4
gpt4 key购买 nike

我对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com