4

この問題を解決してみました Flip-coin は引数をとらず、シンボルの表または裏を等確率でランダムに返します。これは私が得たものですが、なぜ「不可能」なのかわかりません。これを止めることができますか?

(define flip-coin
    (lambda ( )
        (cond
            [ (= (random 2 ) 1 ) "heads" ]
            [ (= (random 2 ) 0 ) "tails" ]
            [else "impossible" ]
        )
    )
)
4

2 に答える 2

5

ステートメントには への2 つの異なる呼び出しがrandomあります。condこれらはどちらも独立しており、異なる結果をもたらす可能性があります。そのため、最初の(random 2)評価が に評価され0、2 番目の評価が に評価され1、両方のケースが失敗して が返される可能性があります"impossible"

解決策は、 の結果を let ステートメントを使用してローカル変数に入れ、 を1 回(random 2)だけ呼び出すようにすることです。random

于 2012-09-12T03:52:02.157 に答える
3

プロシージャは、2 つの可能な値のうちの 1 つだけを返します。flip-coinもう少し単純化できます。また、random一度だけ呼び出す必要があることに注意してください。また、結果がすぐに使用されるため、その値を変数に保存する必要はありません。

(define (flip-coin)
  (if (zero? (random 2))
      "tails"
      "heads"))
于 2012-09-12T04:08:35.137 に答える