Final Verdict:
I went back and used my hacked together program to record results from about 5000 plays. 5016 plays to be exact. Each round consists of 19 plays and takes about 3 minutes. I spent about 13.5 hours gathering this. While probably not statistically as accurate as 10k or more would have been... The results were pretty damning. After 264 rounds, I took the frequency of each winning ring and calculated that as a ratio against the total number of plays.
If everything is purely random the probability of a ring winning is 1:9, 1/9 or .1111 (with a little bar over the ones to indicate it's repeating).
The resulting ratios from the observations were from .08 to .13. No specific type of ring was favored (corner, side, center). I also observed no noticeable difference among people who were actively chatting, moving or otherwise as to winnings.
I think these results are consistent with a decently random game of chance.
The only way to win at this game is to be lucky. My original post was speculating along the lines of the gambler's fallacy and indeed completely contrary to probability & statistics (though very tempting) and based on erroneous assumptions regarding the underlying algorithm.
The basis for the 3x3 ring game (and most likely the others as well) is a decent PRNG with a sufficient level of entropy to be able to avoid any noticeable bias.
If anyone wants to repeat the experiment:
You will want/need (I did it on Linux but I've done this list for Windows, all apps are equivalent or Windows versions of the same app used):
Vim
http://www.vim.org
MS Excel (I used gnumeric)
ActiveState Perl (I used plain old Perl)
+ TK module:
http://www.activestate.com
RLPlot:
http://rlplot.sourceforge.net/
And here's the ugly script for recording your data with (modified to a Windows ActiveState location of perl):
---Cut---
#!C:\Perl\bin\perl.exe
use Tk;
open(RESULTS, "> 3x3-results.csv");
print RESULTS "Play, Winning Ring\n";
my $mw = MainWindow->new;
$mw->title("3x3 Recorder");
$mw->Button(-text=> "1", -command => sub { $plays++; print RESULTS$plays.","."1\n"; })->grid(-row => 0, -column => 0, -ipadx => 3, -padx => 4, -pady => 4);
$mw->Button(-text=> "2", -command => sub { $plays++; print RESULTS$plays.","."2\n"; })->grid(-row => 0, -column => 1, -ipadx => 3, -padx => 4, -pady => 4);
$mw->Button(-text=> "3", -command => sub { $plays++; print RESULTS$plays.","."3\n"; })->grid(-row => 0, -column => 2, -ipadx => 3, -padx => 4, -pady => 4);
$mw->Button(-text=> "4", -command => sub { $plays++; print RESULTS$plays.","."4\n"; })->grid(-row => 1, -column => 0, -ipadx => 3, -padx => 4, -pady => 4);
$mw->Button(-text=> "5", -command => sub { $plays++; print RESULTS$plays.","."5\n"; })->grid(-row => 1, -column => 1, -ipadx => 3, -padx => 4, -pady => 4);
$mw->Button(-text=> "6", -command => sub { $plays++; print RESULTS$plays.","."6\n"; })->grid(-row => 1, -column => 2, -ipadx => 3, -padx => 4, -pady => 4);
$mw->Button(-text=> "7", -command => sub { $plays++; print RESULTS$plays.","."7\n"; })->grid(-row => 2, -column => 0, -ipadx => 3, -padx => 4, -pady => 4);
$mw->Button(-text=> "8", -command => sub { $plays++; print RESULTS$plays.","."8\n"; })->grid(-row => 2, -column => 1, -ipadx => 3, -padx => 4, -pady => 4);
$mw->Button(-text=> "9", -command => sub { $plays++; print RESULTS$plays.","."9\n"; })->grid(-row => 2, -column => 2, -ipadx => 3, -padx => 4, -pady => 4);
$mw->Button(-text=> "Done", -command => sub { close (RESULTS); exit })->grid(-row => 3, -column => 0, -ipadx => 3, -padx => 4, -pady => 4);
$mw->Label(-text=>"Plays:")->grid(-row => 3, -column => 1, -ipadx => 3, -padx => 4, -pady => 4);
$mw->Label(-textvariable=>\$plays)->grid(-row => 3, -column => 2, -ipadx => 3, -padx => 4, -pady => 4);
MainLoop;
---Cut---
That was a fun timesink. Do check out RLPlot if you want a easy to use graphing tool that's free and multiplatform.
- John