球拍中的随机数

时间:2018-08-23 13:36:10

标签: random functional-programming racket

我正在尝试生成0到1之间的随机数,包括球拍中的边界0和1。直到现在我还没有找到解决方案。有什么好方法吗?

2 个答案:

答案 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))