This paper sent to me in 2001 --djr

Chutes and Ladders

A Mathematical Analysis

and Computer Simulation

By Dr. David L. Morgan

The Null Model:

In the Null Model
there are no chutes and no ladders. On each turn, the counter will
advance by between 1 and 6 spaces, or 3.5 spaces on average. Since
the counter needs to travel 100 space to win, a typical null game
will take 100/3.5 or **28.6 moves** to complete.

The Equal Probability Model:

In this model we assume that there is an equal probability to find yourself on any particular square in the game. Of the 100 squares in the game, there are 81 ordinary squares, 9 squares with ladders, and 10 squares with chutes. On the ordinary squares, the counter will advance by 3.5 space on average, while the advance or retreat on the other squares will depend on the specifics of the chute or ladder in question. We can add up all the possibilities to produce an average advance per turn given by?

Avg = ( 81 x 3.5 + S ladders - S chutes ) / 100

Given the particulars of the chutes and ladders on the current Chutes and Ladders game board, this gives us

Avg = (81 x 3.5 + 195 - 243 ) / 100

Given these assumptions a typical game will last **42.5 turns**
- considerably longer than the null game. (I thought so!!)

The Simulation is programmed in C, and runs through an exact replica of the Chutes and Ladders game, with all the chutes and ladders in their proper places. It allows thousands of games to be played in under a minute. The C source code follows.

__SOURCE CODE__

#include<stdlib.h> #include<stdio.h> #include<math.h> int turn, square; long game, totalgames; int seed; int chutehit[10], ladderhit[9]; float RunningTurnTotal; float average; char reply; main() { printf("Welcome to the Chutes and Ladders simulation \n"); printf("...\n"); srand(1); printf("How many games would you like me to run? __ "); scanf("%i",&totalgames); printf("\n You have chosen to run %i games... thank you! \n", totalgames); do{ RunningTurnTotal=0.0; game=1; do{ turn=0; square=0; /** Reset game **/ do /** Begin game loop **/ { ++turn; RunningTurnTotal = RunningTurnTotal + 1; square = square + 1 + rand()%6; /** Spin and move **/ if (square == 1) {square=23; ++ladderhit[0];} /** Ladders? **/ if (square == 4) {square=14; ++ladderhit[1];} if (square == 9) {square=31; ++ladderhit[2];} if (square == 21) {square=42; ++ladderhit[3];} if (square == 28) {square=84; ++ladderhit[4];} if (square == 36) {square=44; ++ladderhit[5];} if (square == 51) {square=67; ++ladderhit[6];} if (square == 71) {square=91; ++ladderhit[7];} if (square == 80) {square=100;++ladderhit[8];} if (square == 98) {square=78; ++chutehit[0];} /** Chutes ? **/ if (square == 95) {square=75; ++chutehit[1];} if (square == 93) {square=73; ++chutehit[2];} if (square == 87) {square=24; ++chutehit[3];} if (square == 62) {square=19; ++chutehit[4];} if (square == 64) {square=60; ++chutehit[5];} if (square == 56) {square=53; ++chutehit[6];} if (square == 49) {square=11; ++chutehit[7];} if (square == 48) {square=26; ++chutehit[8];} if (square == 16) {square=6; ++chutehit[9];} } while (square<100); printf("\n\n Game over after %d turns\n", turn); ++game; } while (game<totalgames); printf("\nSimulation complete... beginning statistical analysis...\n\n"); printf("Total number of games played: %d \n", game); printf("Total number of turns: %f \n", RunningTurnTotal); average = RunningTurnTotal / game; printf("Avg number of turns per game: %f \n", average); printf("\n"); ChuteStats(); printf("\n"); printf("\n\n Would you like to run the simulation again? (1=Yes)..."); scanf("%i",&reply); } while (reply == 1); } ChuteStats() {printf("Chute and Ladder Statistics:\n\n"); printf("Chute0: %d Ladder0: %d\n", chutehit[0], ladderhit[0]); printf("Chute1: %d Ladder1: %d\n", chutehit[1], ladderhit[1]); printf("Chute2: %d Ladder2: %d\n", chutehit[2], ladderhit[2]); printf("Chute3: %d Ladder3: %d\n", chutehit[3], ladderhit[3]); printf("Chute4: %d Ladder4: %d\n", chutehit[4], ladderhit[4]); printf("Chute5: %d Ladder5: %d\n", chutehit[5], ladderhit[5]); printf("Chute6: %d Ladder6: %d\n", chutehit[6], ladderhit[6]); printf("Chute7: %d Ladder7: %d\n", chutehit[7], ladderhit[7]); printf("Chute8: %d Ladder8: %d\n", chutehit[8], ladderhit[8]); printf("Chute9: %d \n", chutehit[9]); }

__Results__

Total number of games played: 10,000

Total number of turns: 357534

Chute and Ladder Statistics:

Chute0: 2172 Ladder0: 1649

Chute1: 3820 Ladder1: 2218

Chute2: 3743 Ladder2: 2781

Chute3: 4831 Ladder3: 3476

Chute4: 2294 __Ladder4: 6077__

Chute5: 2226 Ladder5: 5889

Chute6: 3017 Ladder6: 3886

Chute7: 5641 Ladder7: 2575

__Chute8: 6709__ Ladder8: 4276

Chute9: 4413

__Conclusions__

As expected, the number of turns in a typical Chutes and Ladders game is considerably more than the 28 moves it would take if the chutes and ladders were removed. However, the naïve Equal Probability model overestimates the number of turns needed to complete the game by nearly 20%. (42 moves, compared to the actual result of just less than 36 moves.) This is not surprising since the model treats hitting a chute or ladder as equally probable on any move. This is not the case. In fact there are some chutes which are encountered significantly more than others. In particular "chute #8" - which goes from square #48 to square #26 - seems to be encountered considerably more often than any of the others. Likewise "ladder #4" which moves the counter ahead more than 50 spaces seems to garner more hits than any of the other ladders. Even though there are more chutes than ladders (and on the average a chute will move you back more than a ladder will move you forward) it appears that the particular arrangement of the game board leads to a rate of progress which is noticeably faster than if the jumps and falls came at random.