This program is a simulation of a day's traffic flow through a polling place. It is based on simple queueing theory
and data from research projects regarding polling places and elections. Each time you run the simulation, voters arrive
randomly within a pattern based on data collected at polling places. There is randomness involved, just as in reality.
But as you will see, the randomness approximates the typical daily flow found at polling places, which should give you
an accurate range of possible wait times that might develop.
The basic design simulates a polling place with a number of check-in stations (or just one), where the first line will
form. Then there is a number of voting stations, for which the second line will form.
For those using optical-scan ballots that require voters to run their ballots through a scanner after completion
of the ballot, there is also an option to simulate lines for the scanner(s).
The simulation also has an option to handle same-day registration stations for those states to which they apply.
The simulation makes the assumption that arriving voters will be directed to a check-in station if
already registered, or a registration station if not. Both of those lines will feed
into the voting station line as the check-in or registration tasks are completed.
You will quickly discover that waiting times are surprisingly sensitive to the average amount of time to check-in and the
average time to complete a ballot.
As you know, time to complete a ballot depends greatly on the length and make-up of the
ballot. The voting technology used also has a minor impact. We can only provide a starting point for ballot completion time;
you must provide a reasonably accurate estimate for each election for this simulation to give you accurate
estimates of potential waiting times.
Likewise, the average amount of time to check-in depends on the process used and the people staffing that step.
When setting this value, remember to not assume that every voter will check in smoothly. Don't use a number for the
amount of time it ought to normally take. The average that you provide must include those who for whatever
reason take extra time at the check-in station. If one out of every ten voters takes a couple extra minutes to
check in because of some issue, that will affect the process, your average, and the waiting times.
Similarly, your average scanning time (for those who use that option), should consider those that do not go smoothly.
Don't just use a number that represents how long it should take if all goes well, because seldom does all go well for
Lastly, your average times must account for the turnover period between voters. If 30 seconds elapse between the time one
person completes a ballot and the next person settles in at the same voting station and begins voting, those 30 seconds
MUST be part of the average that you use.
Simulating All Your Precincts
When you upload a list of all your precincts (from an Excel spreadsheet or a similar source), along with turnout
estimates and resource deployment, you can run this simulation across all precincts at once to see which
have potential problems. A new table will appear at the bottom of the page with stats for each precinct, which can
then be sorted on any field and on which adjustments can be made. See the Load your own data section of
this help page for details.
Feedback, Suggestions, and Critiques
This simulation was written by Mark Pelczarski. Questions, comments, suggestions, and pleas for
help are welcome. E-mail Mark here.
The Five Key Inputs
Above the simulation graph you will see inputs for Expected Voters, Check-in Stations,
and Voting Stations. Below the graph are inputs for Average Minutes to Check in and
Average Minutes to Vote. These are the 5 values that will have the greatest effect on the
waiting times shown by the simulation.
Expected Voters is the number of voters expected to vote in person that day. Absentee and early
voters should not be included in this number. Although designed by default for election-day voting, potential
waiting times during early-vote days can also be simulated if you can estimate the turnout for the day in question.
The number of check-in stations and the number of voting stations are your inputs for the resources
you deploy. For our purposes, the way lines may be split for check-in stations won't matter much; the average
wait times will only differ when a polling place is relatively quiet and some check-in stations are open while others
have a short wait. During busy times when all check-in stations are in use, the average waiting time is not affected.
Minutes to Check in and Minutes to Vote are critical values for which you should supply
realistic values. It is very worthwhile to take some sample times if you are able to do so prior to an
election, once the ballot is known. If you are able to research and document your own check-in and voting times,
it would be very useful if you could share your results (with a sample of your ballot for the voting time) so we
can perhaps refine this simulation with more predictive data.
(E-mail link) Remember to include your "turnover time"
in your averages, or the time between one person leaving a station and the next person arriving and starting the process.
Another way to look at it is that the average should include the entire time from one person leaving a station through
the next person leaving that station.
What You See on the Graph
Each time you run the simulation, you will see the resulting average, maximum, and minimum wait times throughout
the day. The graph shows the time of day, from left to right. The height of the graph shows the waiting-time results.
The yellow area in the graph is the waiting time for the check-in stations. The violet area is the waiting time
for the voting stations. The total height of the graph at any time of day is the average total waiting time for
people who arrive at that time. (The solid line is the average; the dotted lines show the shortest and longest
waits. See the Settings section of this help document for more explanation.)
To see less yellow, add check-in stations or decrease the average check-in time. To see less violet, add voting
stations or decrease the average time to complete a ballot.
It's a Simulation
Instead of a straight mathematical computation which gives consistent results, this simulation gets a little
closer to reality by randomizing voter arrival within certain constraints each time you run it. If you click the
Run Simulation button again without changing any values, you will get slightly different results each time.
That's because of the random factor, and that's more like reality. Simply put, if just two people arrive 5 minutes
apart, neither will have to wait and the average wait time for those two people is zero. But if those same two
people arrive at exactly the same time (and there's just one check-in station), one of those two will wait,
and thus the "average" wait time is longer.
The dotted lines on the graph for the minimum and maximum wait times give you an idea of the range of possible
outcomes with the same data.
If your polling place has optical scanners that voters must use after completing the ballot at their voting station,
you can also simulate scanner lines by providing the number of scanners available and the average time it takes to scan
a ballot (including turnover time from one voter to the next!).
At the bottom of the graph, under the "Run Simulation" button, click the "Scanner lines" checkbox. Now, above the graph
you will see an input for the number of scanners available and below the graph you'll see an input for the "Average
number of minutes to scan". The graph will then show waiting time for all three stations next time the simulation
If same-day registration is allowed in your state, check the "Same-day Registration" box under the "Run Simulation"
button at the bottom of the graph. New inputs choices will appear above the graph for the number of registration stations
and below the graph for the average time to register.
This simulation assumes that already-registered voters will wait in the regular check-in lines and that those who need
to register will wait in a separate line for the registration station(s). Then it assumes that BOTH lines will feed into
the voting station line. That is, we assume the registration station also serves as a check-in station for those voters,
and after registering they will proceed to vote and will NOT get into the regular check-in lines.
In the results, the average check-in time (yellow area on the graph), will be the average waiting time for ALL voters,
regardless of whether they waited in the regular check-in line or waited in the registration/check-in line. A separate red
line will appear on the graph showing the average wait for registration. The way to interpret that is if the red line
is above the yellow area, people are waiting longer in the registration lines than the regular check-in lines, and that
pulling up your total average check-in waits. Adding a registration station will help. But if the red line is below the
top of the yellow area that means the average check-in wait is NOT due to registration lines; instead the regular
check-in waits are longer than the registration waits so you should add check-in stations.
You can set the times that the polls open and close. This will compress or spread out the arrivals, and thus
have some effect on the waiting times.
Below the graph, you can select an Arrival Pattern. These patterns were derived from arrival data sampled at
numerous polling places during several election cycles. (See the Settings section of this help document for
how you can view the arrival patterns on the graph.) Unless you use the "Saturday: steady" pattern, which perhaps
might describe a Saturday during early voting, the default "Composite" pattern gives a good indication of potential
wait times, although the time of day that waiting develops could vary with the arrival pattern of each particular
The Cannot check in value describes a percentage of voters who are unable to check in for some reason, and thus
do not move on to the voting queue.
The Simulate Walk-Offs checkbox adds a feature that "predicts" a possible number of voters who see that a line
of some length has formed and they choose to leave rather than wait. The longer the line gets, more potential voters
will walk off instead of wait. These projections are based on results of Marist polls that asked voters how long
they'd be willing to wait in line to vote prior to recent general elections. Since these numbers are based on what
people said vs. observations of what they actually did (which is probably impossible to accurately measure),
the "Walk-off" predictions should be taken in context: they might indicate the potential of a serious problem, but
they should not be taken as an accurate prediction of lost voters.
Looking at the Simulation Settings
If you want to dig deeper into how this simulation works, at the bottom of the page click on Show Simulation Settings
and more options will appear just below that. Here's where you can see a little more of the nitty-gritty of how
Number of Repetitions is how many times the simulation actually runs through a day randomly before giving you
its results. It simulates the same voting day with the same input data 20 different times (by default) with 20 random sets
of arrivals before computing the averages and telling you the maximum and minimum waits that it found. If you change "20" to "1"
and click the Run Simulation button over and over, you'll see just a single attempt at the simulation each time,
and the results will vary more. If you change it to "100", the computer might take a little longer running through
100 simulations of the same day, but your average will be more accurate and your minimum and maximum values will
The Show Range checkbox turns off and on those dotted gray lines that display the minimum and maximum results.
A less-cluttered graph is prettier; but it tells you less.
Lines are formed when a lot of people arrive around the same time of day. If they'd only cooperate and space themselves
out evenly throughout the day, our lives would be much simpler. But they don't.
Check Show Arrival Pattern to see a new gray line through the middle of your graph that displays the arrival
pattern used from the Arrival Pattern choice given above and discussed earlier. ("Composite" was the default.)
The right side of your graph shows a new set of numbers for that gray line. Those percentages are the percentage of
voters who show up during each 15-minute interval using this pattern. If you're looking at the "Composite" pattern,
you'll see that about 3% of the day's voters are expected to arrive around 5:30-5:45pm. Likewise, slightly more than
3% are likely to show up around 7:15am, whereas only 1.25% show up around 8:30am in this same pattern. This doesn't mean that
those are the exact percentages that will occur when you run the simulation. Those likelihoods inform the randomness, but
the arrivals are still random.
To get an even more accurate picture of what's going on, click Show Arrivals Used and set the
Number of Repetitions to "1", then click the Run Simulation button. A new green line appears that shows
the times that our simulated voters actually arrived. The graph of that green line looks a lot more like the data
that was collected while recording actual arrivals at polling places, which is to say that real people don't conveniently
follow our exact mathematical models. Click Run Simulation several more times
and watch how that green line changes. This is what we're actually feeding into the simulation to make our "wait time"
But notice also how the green line somewhat approximates the gray line that is the pattern we're using. That gray line
was derived from actual data that looked like all those green lines you just clicked through. Change
Number of Repetitions back to "20" and click Run Simulation again and you'll see that after 20 repetitions
the aggregate random arrivals approximate our pattern more closely.
And if all this random stuff bothers you, click Arrivals Follow Pattern and then even with only 1 repetition
you'll see that our simulated voters behave exactly like the pattern predicts.
Using your own data
If you create a table in an Excel spreadsheet (or similar application) with columns for precinct names,
turnout estimates, number of check-in stations, and number of voting stations, you can then save that spreadsheet
in a format that you can load right into the simulation and run then run the simulation across all precincts at once.
When you do so, a new table appears at the bottom of the simulation page with every precinct in your list
and predicted wait times and possible walk-offs for each. You can adjust the number of check-in stations and voting
stations for each and get immediate feedback about the potential results. You can then download the alterations and
feed them back into Excel or another program to remember your settings and adjustments.
Creating the data
We'll talk about the Excel spreadsheet application here, but any program that can create "tab-delimited text files"
or "CSV files" can be used.
The first row of your spreadsheet will be headings that MUST match the names we list here, because the simulation will
look for exactly those headings when it reads the file you load in. The order of the columns does not matter at all.
Only the headings are used for putting your data in the right place.
The only required heading and column is "Precinct". In this column you will list the names or designations you want to use
for each precinct you'll want to run in the simulation. Please avoid commas in those names, since commas will mess up
our use of the CSV file format.
All other columns are optional, although if omitted we'll add default values that you'll almost certainly want to
change, and it's probably faster for you to do that in your spreadsheet. The additional and optional column headings are:
"County", "Turnout", "Minutes to Vote", "Check-in Stations", "Voting Stations", "Registration", and "Registration Stations".
"County" is for grouping precincts by county when using this on a larger scale. However it can also be used to create
named subsets of your precincts if you have many and want to work with smaller sets. A "county" list will appear, and
when you select a "county" only the precincts within that county will be shown in the precinct list and in the table at
the bottom of the page.
"Turnout" is the number of in-person voters expected on the election day. You should not include absentee and early voters
in this number, nor should this be the total number of registered voters. However you may choose to use a "Registered Voters"
column in your spreadsheet (which will be ignored by the simulation) and put a computation in the "Turnout" column that
will compute some percentage of your registered voters that you estimate will vote in-person on election day. You can
also use "Turnout" to simulate arrivals on an early-voting day.
"Check-in Stations" and "Voting Stations" should be the number of each that you plan to deploy in each precinct. Again,
you might want to use other columns in your spreadsheet (that we'll ignore if the headings are not what we look for) and
then insert a calculation under these two columns. Some places calculate the number of voting booths for each precinct
using a formula based on the number of registered voters, and something like that could be appropriate here.
If you do not supply columns with headings for "Check-in Stations" and "Voting Stations", we'll use our own
calculation to suggest a starting point for what you might want to supply.
"Minutes to Vote" can be set for all your precincts directly in the application. However, if you know you have
different ballot lengths across your precincts, you might want to assign different times here for precincts. Please
enter your values in minutes and fractions thereof. For example, don't use "4:30" for "4 minutes and 30 seconds".
Instead, use "4.5".
"Minutes to Check In" should be consistent across precincts and most often will be set directly in the simulation. However you
can add this column if you'd like to provide this via spreadsheet and if there is variance among the precincts. Again, please
specify in minutes and fractions thereof, such as "1.5" for "1 minute and 30 seconds".
Time to register should be relatively consistent across precincts, so those values should
be set directly in the simulation.
For those states that allow same-day registration, if you add a column titled "Registration", that will be the
number of voters (already included in "Turnout") that you will expect to show up on election day who need to
register. This will automatically put the simulation in same-day registration mode, adding a registration line in
addition to the normal check-in lines. The assumption is that voters going through same-day registration will
proceed directly to the voting line after registration and that those voters will never wait in the regular
check-in lines. Again, you might want to create your numbers in this column on a computation based on other columns,
such as "16% of my turnout on election day will need to register" (translated to Excel formulas, of course).
Use a column titled "Registration Stations" if you want to specify the number of registration stations in each
precinct. Otherwise we will use our own computation to suggest a number.
Saving your spreadsheet to use in the simulation
When you've completed your spreadsheet, save it once in regular Excel format if you've used formulas and you want
to be able to edit it with those same formulas. Then choose "Save As" followed by "Save As Type" and select
"Text (Tab delimited)". Alternately you can use "CSV (Comma delimited)", but only if you've managed to avoid using
commas in your data.
Load your data into the simulation
Near the top of the simulation there is a Load Precinct Data button. Click it. Choose the tab-delimited or
CSV file that you saved. Click Okay.
If all went correctly, you should now see new County and Precinct lists at the top of the simulation.
If you select a precinct from the list, the Expected Voters, Check-in Stations, and Voting Stations
values for that precinct should appear from the data you provided. Remember to set Minutes to Check-in and
Minutes to Vote, if you did not provide that in your spreadsheet.
Precinct data table
Scroll to the bottom of the simulation and you'll see a new choice, Edit Precinct Data. Click that, and a table will
appear below with a list of all your precincts, and columns for check-in stations, voting stations, wait time, and
walk-offs. Above the table is a button that says Compute Wait Times. Click that and the simulation will be run
for each precinct and the longest average wait time shown for each. At the top of the table you can click the Precinct,
Wait, or Walkoff column heading to sort the table by that column.
You can also edit the numbers in the Check-in and Voting station columns to recompute the longest average
wait time for that row with the new values. These changes will be remembered, and you can click the Download Current
Data button at the top of the simulation to save your changes back to a CSV file that will load right back into Excel.
Note that changes made to Check-in Stations and Voting Stations above the simulation graph (near the top
of the page) are exploratory only and are NOT recorded in the precinct table at the bottom. If you want to save new values
for check-in and voting stations, you should change the values in the table instead.