我正在尝试生成0到1之间的随机数,包括球拍中的边界0和1。直到现在我还没有找到解决方案。有什么好方法吗?
答案 0 :(得分:7)
As soegaard mentions in his answer,您应该只使用(random)
。的确,它会产生一个在打开范围(0,1)中的数字,而不是您想要的关闭范围[0,1]。但是,我将提出一些数字支持的论点,即两者之间的差异无关紧要。
random
过程产生一个IEEE 754双精度浮点数。 0以后可以用该格式表示的第二大数字大约是4.94×10 -324 。如果我们假设(random)
确实产生了一个在该范围内均匀分布的数字,那么这意味着实际产生0.0
的概率是4.94×10 324 中的一个。 sup>!为您提供该数字的一些背景信息,这意味着即使您每秒生成十亿个随机数,平均仍需要 6.41×10 306 年 >甚至一次生成0.0
。
在该范围的另一端情况下,严峻程度较小,因为1与用双小粒表示的倒数第二个数字之间的差明显更大:大约1.11×10 -16 。在此范围的末端,如果我们每秒再次生成十亿个随机数,那么平均需要“仅” 104天才能第一次生成1.0
。但是,与您已经生成的大量数据相比,这仍然是微不足道的(实际上,您不太可能一开始就每秒生成十亿个随机数,因为它仅需一分钟多一点的时间)在我的计算机上生成十亿个随机数。
不用担心范围的末端缺失,因为它们确实无关紧要。只需调用(random)
并完成操作即可。
答案 1 :(得分:4)
使用(random)
生成一个介于0.0和1.0之间的数字。
要包含0.0和1.0,可以使用:
(define (r)
(/ (random 4294967087)
4294967086.0))