Lab: Histograms
Using Loops
Consider the following exercises.+
- One can simulate the movement of a fish in an aquarium by repeatedly flipping
a coin. When "heads" is flipped, the fish moves one foot to the right; when
"tails" is flipped, it moves one foot to the left. (We are assuming a long,
narrow aquarium.) Assume that the fish's initial location is labeled 0 and
that locations to the right are positive while locations to the left are negative.
For example, the fish in its initial location has left and right neighbors
at locations -1 and +1, respectively. What are the possible positions
of the fish, relative to its starting position, at the end of a simulation
with six coin flips? Explain. (Don't worry about the tank being too short.)
- Conduct several such simulations, each with six coin flips as described
in the exercise above, and keep track of where the fish ends up after each
simulation. Is the fish more likely to end up in one position than another?
Explain why or why not.
In this lab you will write a program that will simulate a fish (or other object)
moving randomly back and forth six times, starting at location 0. Initially your
program will print the final location of the object (an integer between -6 and
6). You will then modify your program to run the simulation 1000 times, keeping
track of how many times the object ends up in each of the possible final locations.
Finally, you will enhance your program to draw a histogram (bar graph) of the
various final locations. For example, a text-based histogram might look like the
following:
-6 xxxxx
-4 xxxxxxxxx
-2 xxxxxxxxxxxxxx
0 xxxxxxxxxxxxxxxxx
2 xxxxxxxxxxxxxx
4 xxxxxxxxx
6 xxxxx
Simulate an object moving six times.
- Download the files for the Histogram program
to your working space. Create a project containing all the files in the
JavaSourceFiles
folder. You will be editing the HistogramLab.java
file.
As you do so, remember to write appropriate
comments that describe the purpose of the code you are about to
write (what you are trying to accomplish) before writing it.
- Research the class documentation
for the
Coin
class to learn how to construct a coin using
the default Coin
constructor. Then construct an integer variable
to represent the object's location. Initialize it to 0.
- Research the
Coin
class
documentation to learn how to toss a coin and how to determine whether
the tossed coin is showing heads or tails. Modify your program to toss the
coin six times. Each time you toss the coin, update the location variable
to reflect a move to the right if the coin comes up heads, or a move to the
left if the coin comes up tails.
- After moving the object six times, print its final location. Run your program
several times to test it.
Add multiple runs.
- In order to keep track of how many times the object ends up in each location
over the course of many runs of the simulation, create an integer variable
to represent each of the possible final locations, e.g.,
minusSixCount,
zeroCount,
etc. Be sure to initialize each of them to 0. (Question:
how many integer variables will you need to represent all of the possible
final locations?)
- Embed the code you wrote earlier in a loop, in order to run the simulation
1000 times. Remember that the object needs to start at location 0 each time.
Rather than printing out 1000 final location values, just increment the appropriate
location counter after each run. (Note that there's a constant called
NUM_ITERATIONS
that you should use instead of "hard-coding" the number 1000 throughout
your code.)
- After running the simulation
NUM_ITERATIONS
times, print the
number of times the fish ended up in each of the possible final locations.
Run your program several times to test it. Do your results seem to make sense?
You may wish to double-check that the various counts add up to 1000.
Draw a histogram.
- Examine the commented-out block of code that constructs a histogram
object. The first statement creates a table of cells that can be
accessed by row and column. The next two statements put the text
"-6" in text cell (0,2) and colors the cell (0,5) red. The last
statement displays the histogram table. Uncomment this code, run the
program, and see what happens.
-
Research the
DisplayableTable
class documentation to learn how to call the
add
method. Note that there are two methods named add
,
both of which expect three parameters. The first
method expects a Color
to paint the cell, the cell's
row, and the cell's column. The second add
method expects a
String
of
text to put in the cell and the cell's row and column.
The code you uncommented out contained an example of each
add
method.
-
Now you are ready to make a histogram of your results. To do this,
you will create rows of color
blocks, where each row will indicate the number of times the fish
ended up in a particular final location.
First, create just a single row indicating how many times the fish
ended up in the -6 location.
Create a loop around the second
add
call to add the appropriate number of red blocks for that
row of the histogram. Each red block will go in a new column.
Test your program.
- Once you have the first row of your histrogram displaying
correctly, add in the code to fill in the remaining rows of the
histogram.
- Run your program several times to test it. You may also want to experiment
with running it different numbers of times; for example, run the program several
times with
NUM_ITERATIONS
set to 10, then several times with NUM_ITERATIONS
set to 20 and 100. How does the behavior change as the number of iterations
changes? Why?
- When you're sure that your program runs correctly, you may remove the System.out.println
statements that printed the various final location counters. Also remove the
statement at the beginning of the
main
method that said what
the program would do once it was written.
- Update the class documentation for
HistogramLab.java
to accurately
describe the purpose and behavior of the class from a user's perspective.
Focus on what the program does, rather than how it does it.
Include your name and the date as well as the names of anyone from whom you
received help. Providing proper documentation is an important step towards
writing well-structured and reusable programs.
+These questions came from the C++ Advanced Placement Computer
Science Marine Biology Case Study, used from 1999 - 2003.