juste pour le plaisir J'ai écrit une simulation du "monty hall problem" en Python. Plus tard, j'ai expérimenté avec Lua et j'ai décidé de l'écrire à Lua pour voir à quoi cela ressemblera en comparaison. Ce fut une expérience assez intéressante même si les programmes étaient très similaires (la version Lua était légèrement plus courte). Dernièrement j'ai commencé à m'exercer avec CL et je voulais refaire la même chose. Cependant quand je l'exécute, il ne se comporte pas comme prévu. Pour une raison quelconque, le joueur erratique (qui devrait avoir une chance de gagner de 66%) a presque le même score que le joueur naïf (avec 50% de chances de gagner).Premier grand programme lisp (commun) -> 'random' ne fonctionnait pas comme prévu
Quelqu'un peut-il me donner un indice de ce qui ne va pas? Ce n'est pas un devoir ou quelque chose comme ça, juste mon premier essai d'écrire un plus grand programme avec CL. Outre des conseils sur le problème décrit ci-dessus, je voudrais également des suggestions sur la façon d'améliorer mon style. Je suppose que c'est toujours joli Python-ish (c'est plus ou moins une traduction directe).
(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))
sortie (par exemple):
--- Monty Hall ---
Simulating 10000 games...
NAIVE-PLAYER score: 5014
STUBBORN-PLAYER score: 3333
ERRATIC-PLAYER score: 4968
Pourquoi le lecteur erratique devrait-il faire mieux? Ces pourcentages ne devraient-ils pas être l'inverse? – murgatroid99
Tout d'abord je ne sais pas si le nom erratique était vraiment un bon choix. L'anglais n'est pas ma langue maternelle. Le joueur erratique changera TOUJOURS son choix. Dans un tel jeu, les chances de gagner sont meilleures lorsque vous changez votre choix (voir l'article wikipedia). Dans la simulation python et lua, je vois aussi que dans les résultats de simulation, mais pas dans la version lisp :( – katzenversteher
Je vois ce que vous voulez dire maintenant En anglais, "erratique" est plus comme "imprévisible", donc je supposais que vous vouliez dire l'erratique – murgatroid99