1

楽しみのために、Python で「モンティ ホール問題」のシミュレーションを作成しました。その後、Lua で実験を行い、比較してどのように見えるかを確認するために、もう一度 Lua で記述することにしました。プログラムは非常によく似ていましたが (Lua バージョンは少し短かった)、非常に興味深い経験でした。最近CLで実験を始めて、また同じことをしたいと思っていました。ただし、実行すると、期待どおりに動作しません。なんらかの理由で、常軌を逸したプレーヤー (勝率は 66% になるはず) は、ナイーブなプレーヤー (勝率は 50%) とほぼ同じスコアになります。

誰かが私に何がうまくいかないのかヒントを教えてもらえますか? これは宿題などではなく、CL でより大きなプログラムを作成する最初の試みです。上記の問題に関するヒントに加えて、私のスタイルを改善する方法についての提案も歓迎します. 私はそれがまだかなりPythonっぽいと思います(多かれ少なかれ直訳です)。

(defun choose-one (l)
  "Ramdomly chooses one element of the given list"
  (nth (random (length l)) l))

(defun remove-one (l)
  "Randomly removes one element of the given list"
  (remove (choose-one l) l))

(defun naive-player (initial-choice possible-choices)
  "The naive player randomly picks one choice. Should have a 50% chance to win."
  initial-choice ;keep compiler happy
  (choose-one possible-choices))

(defun stubborn-player (initial-choice possible-choices)
  "The stubborn player sticks with his initial choice. Should have a 33% chance to win."
  possible-choices ;keep compiler happy
  initial-choice)

(defun erratic-player (initial-choice possible-choices)
  "The erratic player will always change his choice. Should have a 66% chance to win."
  (choose-one (remove initial-choice possible-choices)))

(defun host-offer (prize possible-choices)
  "The host reveals one wrong choice."
  (let ((remaining (remove prize possible-choices)))
    (remove (choose-one remaining) possible-choices)))

(defun one-game (playerfn choices)
  "Simulates a single game with the given player. Evaluates to T if the player won."
  (let ((prize (choose-one choices))
        (player-choice (choose-one choices)))
    (eq (funcall playerfn player-choice (host-offer prize choices)) prize)))


(defun multiple-games (num-games)
  "Simulates the given number of games with all players. Evaluates to a result list."
  (let ((choices '(door_a door_b door_c))
        (naive-score 0)
        (stubborn-score 0)
        (erratic-score 0))
    ;(progn
      (dotimes (i num-games)
        ;(progn
          (if (one-game #'naive-player choices)
              (incf naive-score))
          (if (one-game #'stubborn-player choices)
              (incf stubborn-score)) 
          (if (one-game #'erratic-player choices)
              (incf erratic-score)));)
      (list 
       (list 'naive-player naive-score) 
       (list 'stubborn-player stubborn-score)
       (list 'erratic-player erratic-score))));)

;; Run simulation and display results
(defparameter *num-games* 10000)
(format *standard-output* "--- Monty Hall ---~%")
(format *standard-output* "Simulating ~D games...~%" *num-games*)
(let ((result (multiple-games *num-games*)))
  (format *standard-output* "~{~{~A score: ~D~}~%~}" result))

出力 (例):

--- Monty Hall ---
Simulating 10000 games...
NAIVE-PLAYER score: 5014
STUBBORN-PLAYER score: 3333
ERRATIC-PLAYER score: 4968
4

1 に答える 1

6

ホスト提供機能が間違っています。定義されたモンティ ホール問題では、ホストはプレイヤーが選択したドアを開けませんが、プログラムはそれを考慮していません。それが修正された場合、プログラムは期待される結果を返します。

于 2012-05-23T19:05:36.567 に答える