让Scheme中的语句/随机函数

时间:2013-09-10 01:31:11

标签: random scheme distance formula

我想知道我是否能够使用scheme中的内置let函数来定义函数中的两个随机变量,而不会在整个代码中更改它们的值。例如,如果我写道:

 (let (x (- (* 2 (random)) 1)))
 (let (y (- (* 2 (random)) 1)))

在函数退出之前,x的值是否会保持不变?我想对x和y求平方并取它们的平方根,但我需要它们的值保持不变。

1 个答案:

答案 0 :(得分:0)

是的,let将值绑定到给定的标识符,除非您在其上使用set!,否则其值不会更改。

所以你可以这样做:

(let ((x (- (* 2 (random)) 1))
      (y (- (* 2 (random)) 1)))
  (sqrt (+ (* x x) (* y y))))

当然,我发现为你正在做的事情定义hypot函数更容易(对应于C的hypot函数):

(define (hypot x y)
  (sqrt (+ (* x x) (* y y))))

(hypot (- (* 2 (random)) 1)
       (- (* 2 (random)) 1))

现在您根本不需要使用let

如果连接不是很明显,let在幕后工作的方式是创建一个函数(在这种情况下与hypot几乎相同的内容),并且只是使用您绑定的值调用函数。因此,上面两段代码实际上是完全相同的(除了后者还为hypot添加了顶级绑定)。