2012-05-23 2 views
1

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 
+1

Pourquoi le lecteur erratique devrait-il faire mieux? Ces pourcentages ne devraient-ils pas être l'inverse? – murgatroid99

+0

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

+1

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

Répondre

6

La fonction offre d'accueil est erroné. Dans le problème de Monty Hall tel que défini, l'hôte n'ouvrira jamais la porte que le joueur a choisie, mais votre programme n'en tient pas compte. Si cela est corrigé, le programme renvoie les résultats attendus.

+0

Vous avez raison, j'ai complètement raté cela et concentré sur le reste du programme quand j'ai cherché le bogue .. Je n'ai pas non plus cette fonction dans les versions Python et Lua (mais bien sûr je supprime aussi le choix du joueur) La version CL a beaucoup plus de fonctions depuis que j'ai l'impression que beaucoup de nidification en CL b ecomes illisibles (pour moi) rapidement. sortie après le correctif: --- --- Monty Hall Simuler 10000 jeux ... Score NAIVE JOUEURS: 4924 Score TÊTU JOUEURS: 3325 Score IRRÉGULIÈRE-PLAYER: 6684 – katzenversteher

Questions connexes