Random 抛硬币计划程序

Random 抛硬币计划程序,random,scheme,probability,Random,Scheme,Probability,我试着解决这个问题 Flip coin不接受争论,以相同的概率随机返回符号的正面或反面。 这就是我得到的,但我不明白为什么它给了我“不可能”的东西,这能被阻止吗 (define flip-coin (lambda ( ) (cond [ (= (random 2 ) 1 ) "heads" ] [ (= (random 2 ) 0 ) "tails" ] [else "impossible" ]

我试着解决这个问题 Flip coin不接受争论,以相同的概率随机返回符号的正面或反面。 这就是我得到的,但我不明白为什么它给了我“不可能”的东西,这能被阻止吗

(define flip-coin
    (lambda ( )
        (cond
            [ (= (random 2 ) 1 ) "heads" ]
            [ (= (random 2 ) 0 ) "tails" ]
            [else "impossible" ]
        )
    )
)
cond
语句中有两个不同的调用
random
。这两种方法都是独立的,可以得到不同的结果。因此,第一个
(随机2)
的计算结果可能是
0
,第二个
1
,这两种情况都会失败,给你
“不可能”


解决方案是使用let语句将
(random 2)
的结果放入局部变量中,确保只调用
random
一次。

flip coin过程只返回两个可能值中的一个,可以进一步简化,还要注意的是,
random
应该只调用一次,并且不需要将其值保存在变量中,因为结果会立即使用:

(define (flip-coin)
  (if (zero? (random 2))
      "tails"
      "heads"))

谢谢真不敢相信我错过了!