Random Scheme中的Let语句/随机函数

Random Scheme中的Let语句/随机函数,random,scheme,distance,formula,Random,Scheme,Distance,Formula,我想知道我是否能够使用scheme中内置的let函数在函数中定义两个随机变量,而不会在整个代码中改变它们的值。例如,如果我写道: (let (x (- (* 2 (random)) 1))) (let (y (- (* 2 (random)) 1))) 在函数退出之前,x的值是常量吗?我想将x和y平方并取它们的平方根,但我需要它们的值保持不变。是的,让将一个值绑定到给定的标识符,其值不会更改,除非使用设置在上面 所以你可以这样做: (let ((x (- (* 2 (random)) 1)

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

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

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

是的,
将一个值绑定到给定的标识符,其值不会更改,除非使用
设置在上面

所以你可以这样做:

(let ((x (- (* 2 (random)) 1))
      (y (- (* 2 (random)) 1)))
  (sqrt (+ (* x x) (* y y))))
当然,我发现为您正在做的事情定义
hypot
函数更容易(对应于C的函数):

现在您根本不需要使用
let

如果连接不是很明显,那么
在幕后工作的方法是创建一个函数(在本例中,它的内容与
hypot
几乎相同),然后使用绑定的值调用该函数。因此,上面的两段代码实际上是相同的(除了后一段代码还为
hypot
添加了顶级绑定)

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

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