9.12: Exercises
- Page ID
- 17118
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\( \newcommand{\dsum}{\displaystyle\sum\limits} \)
\( \newcommand{\dint}{\displaystyle\int\limits} \)
\( \newcommand{\dlim}{\displaystyle\lim\limits} \)
\( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)
( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\id}{\mathrm{id}}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\kernel}{\mathrm{null}\,}\)
\( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\)
\( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\)
\( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\(\newcommand{\longvect}{\overrightarrow}\)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\ket}[1]{\left| #1 \right>}\)
\(\newcommand{\bra}[1]{\left< #1 \right|}\)
\(\newcommand{\braket}[2]{\left< #1 \vphantom{#2} \right| \left. #2 \vphantom{#1} \right>}\)
\(\newcommand{\braopket}[3]{\left< #1 \vphantom{#2}\vphantom{#3} \right| #2 \vphantom{#1}\vphantom{#3} \left| #3 \vphantom{#1}\vphantom{#2} \right>}\)
\(\newcommand{\qmvec}[1]{\mathbf{\vec{#1}}}\)
\(\newcommand{\op}[1]{\hat{\mathbf{#1}}}\)
\(\newcommand{\expect}[1]{\langle #1 \rangle}\)
\(\newcommand{\dfn}[1]{\emph{\textbf{#1}}}\)
Exercise \(\PageIndex{1}\)
The following are the possible hands in poker, in increasing order of value (and decreasing order of probability):
- pair:
- two cards with the same rank
- two pair:
- two pairs of cards with the same rank
- three of a kind:
- three cards with the same rank
- straight:
- five cards with ranks in sequence (aces can be high or low, so
Ace-2-3-4-5is a straight and so is10-Jack-Queen-King-Ace, butQueen-King-Ace-2-3is not.) - flush:
- five cards with the same suit
- full house:
- three cards with one rank, two cards with another
- four of a kind:
- four cards with the same rank
- straight flush:
- five cards in sequence (as defined above) and with the same suit
The goal of these exercises is to estimate the probability of drawing these various hands.
- Download the following files from http://thinkpython.com/code:
- Card.py
- : A complete version of the
Card,DeckandHandclasses in this chapter. - PokerHand.py
- : An incomplete implementation of a class that represents a poker hand, and some code that tests it.
- If you run
PokerHand.py, it deals seven 7-card poker hands and checks to see if any of them contains a flush. Read this code carefully before you go on. - Add methods to
PokerHand.pynamedhas_pair,has_twopair, etc. that return True or False according to whether or not the hand meets the relevant criteria. Your code should work correctly for “hands” that contain any number of cards (although 5 and 7 are the most common sizes). - Write a method named
classifythat figures out the highest-value classification for a hand and sets thelabelattribute accordingly. For example, a 7-card hand might contain a flush and a pair; it should be labeled “flush”. - When you are convinced that your classification methods are working, the next step is to estimate the probabilities of the various hands. Write a function in
PokerHand.pythat shuffles a deck of cards, divides it into hands, classifies the hands, and counts the number of times various classifications appear. - Print a table of the classifications and their probabilities. Run your program with larger and larger numbers of hands until the output values converge to a reasonable degree of accuracy. Compare your results to the values at http://en.Wikipedia.org/wiki/Hand_rankings.
Exercise \(\PageIndex{2}\)
This exercise uses TurtleWorld from Chapter 4. You will write code that makes Turtles play tag. If you are not familiar with the rules of tag, see http://en.Wikipedia.org/wiki/Tag_(game).
- Download http://thinkpython.com/code/Wobbler.py and run it. You should see a TurtleWorld with three Turtles. If you press the Run button, the Turtles wander at random.
- The
stepmethod gets invoked by TurtleWorld. It invokessteer, which turns the Turtle in the desired direction,wobble, which makes a random turn in proportion to the Turtle’s clumsiness, andmove, which moves forward a few pixels, depending on the Turtle’s speed. - Create a file named
Tagger.py. Import everything fromWobbler, then define a class namedTaggerthat inherits fromWobbler. Callmake_worldpassing theTaggerclass object as an argument. - Add a
steermethod toTaggerto override the one inWobbler. As a starting place, write a version that always points the Turtle toward the origin. Hint: use the math functionatan2and the Turtle attributesx,yandheading. - Modify
steerso that the Turtles stay in bounds. For debugging, you might want to use the Step button, which invokessteponce on each Turtle. - Modify
steerso that each Turtle points toward its nearest neighbor. Hint: Turtles have an attribute,world, that is a reference to the TurtleWorld they live in, and the TurtleWorld has an attribute,animals, that is a list of all Turtles in the world. - Adjust the rules and your
steermethod for good quality play; for example, it should be possible for the slow Turtle to tag the faster Turtles eventually.
- Solution:


