Last time I asserted that bots don't cheat. However, I won't insist that you take my word for it. The two bestselling commercial backgammon bots, Jellyfish and Snowie, both contains tools that allow you to prove to yourself (if you're suspicious) that they don't cheat. In this column I'll show you how to do exactly that.
(Since Jellyfish is the bestselling program, I'll use Jellyfish in my examples. However, the general procedure is exactly the same in Snowie.)
PseudoRandom Numbers
First, a key point. The random numbers generated by a computer program are not random numbers. Instead, they are what are called pseudorandom numbers. There's a small but important difference between the two.
A string of genuine random numbers is usually generated by a physical process, like radioactive decay. A string of genuine random numbers obeys certain rules.
 All digits are equally represented.
 You can't predict future digits from past digits.
 No matter how much you know about the physical system that generated the numbers, you still can't predict the digits in the string.
Pseudorandom numbers obey the first two conditions, but not the third. When a computer generates pseudorandom numbers, it starts by selecting a single number, called the seed. (This is usually done by performing an arithmetical operation on the digits of the system clock.) The seed is typically a number between zero and 65535.
Once the seed is selected, a random number string of any length can be generated. For any seed, this string is unique. In other words, if you start with the same seed, you will always get the same string of random numbers. This sounds like a drawback, and it is in a very theoretical sense. Practically, however, pseudorandom numbers are just as useful for almost any purpose as true random numbers, and they happen to have the great advantage that you can use them to determine if a program is cheating or not.
Let's show how this would work with Jellyfish. (The same method would work with Snowie.) Let's start by running the program. Invisibly to the user, Jellyfish now selects a seed by consulting the system clock, and uses that seed to generate a string of random numbers. To see the seed, click on "View" and then click "Seed". The seed and counter (just a count of where you are in the string of random numbers generated by the seed) are now displayed at the bottom right corner of the window. In my case, the seed is 27370 and the counter is zero. If I shut Jellyfish off and start it again, I'll get a new seed, of course, but the counter will be zero in that case too.
Now I'll start playing a game. Let's watch what happens.
Jellyfish wins the opening roll with a 43, and plays 13/9, 24/21. Standard play.
Now I roll 65, and play 24/13.
Jellyfish rolls a nice shot, 44, and plays 24/20, 13/5, 9/5.
I now roll 66, and play four men from the 13point to my 7point.
Jellyfish rolls 63, and moves 20/11. If you're following along, the position on your board should look like this, with me having the Black pieces and Jellyfish as White:

Diagram 1. Jellyfish (White) has just played 20/11.

I now roll 52 and play 6/1, 24/22.
Jellyfish rolls 52 and hits, 8/3* and 13/11.
I roll 41, playing Bar/21 and 7/6.
Jellyfish rolls 43, hitting and covering with 8/4* 6/3.
I roll 63 and fan. The position now looks like this:

Diagram 2. I just fanned with a 63.

At this point, Jellyfish doubled and I passed. The counter now reads 10, as ten dice rolls have occurred in the game.
So now we know the first ten random dice throws if the seed starts at 27370 and the counter starts at zero. Let's reset Jellyfish to those values and try another game. To reset, click on "View", then "Settings", then click the "Dice" tab. The seed is correct (it's still 27370), but change the counter back to zero.
Now click the yellow dice button to start a new game.
Once again, Jellyfish rolls 43 and plays 24/21, 13/9.
Once again we roll 65, but this time, we're going to play it differently. Since we believe Jellyfish's next roll is 44, and our subsequent roll is 66, we can take advantage of that knowledge by playing 24/18, 6/1*! Now Jellyfish's 44 will miss us completely and our 66 will be a powerhouse. (Of course, if Jellyfish "cheats", it will give itself a different number than 44 to take advantage of our stupid play.) So we play the sillylooking 24/18, 6/1*. Here's the position.

Diagram 3. Black has just played 65 by moving 24/18, 6/1*.

Sure enough, Jellyfish rolls 44 again, and plays bar/21, 13/5, 9/5. Note that since Jellyfish could look ahead and see that my next roll was going to be 66, it could exploit that knowledge by hitting on the 1point this turn. But it doesn't.
I now roll 66, as expected, and play 24/18, 13/7(3).
Jellyfish rolls 63, and plays 13/4. Here is the position:

Diagram 4. White (Jellyfish) has just played 13/4.

Now I roll 52, as in the first game. Normally I would keep my anchor on the 18point and play something like 13/8, 13/11 here. But in the first game, Jellyfish's next roll was another 52. If Jellyfish is going to roll 52, I can break my anchor and try to cash in on my racing advantage without fear of being hit. So I play 18/13, 18/16! Brilliant, unless Jellyfish decides to "cheat" and change its roll.
But it doesn't. Jellyfish dutifully rolls 52 again and plays 8/3, 6/4.
The next few moves are routine. I roll 41 and play 16/11. Jellyfish rolls 43 and plays 6/3, 6/2. I roll 63 and play 11/5, 8/5. Let's look at this last position:

Diagram 5. Black has just played 11/5, 8/5.

The counter now reads 10, just as in the first game. Notice that all the dice rolls were exactly the same as before. In fact, we were able to exploit that fact to make otherwise foolish plays, knowing what Jellyfish's next roll was. We gave Jellyfish several opportunities to "cheat", but it didn't. It simply mechanically generated the dice rolls that were predetermined once the seed was set.
You could repeat this test as many times as you wanted, experimenting with the dice sequences resulting from different seeds. Once you've written down the rolls for a given seed, of course, you can win almost every game from Jellyfish if you wish, by exploiting upcoming rolls as we did in this game. (Fun at first, but pretty boring after awhile.)
Conclusion: Your programs play extremely well, but they don't cheat. Use them to improve your game, but don't let paranoid fantasies get the better of you.
Next time: Handling the High Anchor Games.
