On this page

Source code for Cancellation Betting System analyzer

Introduction

The following program is written in C++. It is quite simple, anybody with a little experience with C++ should be able to understand how it works. I apologize about the lack of documentation but by following the logic it shouldn’t be hard to see what is going on.

//
//  cancellation system analyzer
//  10/19/1998
//

#include <iostream.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <stdio.h>

void tenbet();

int main()
{
char ch;

do
{
    tenbet();

    cerr << "Play again? ";
    cin >> ch;
}
while ((ch == 'y') || (ch == 'Y'));

return 0;
}

void tenbet()
{
int maxloss, num, bet[1000], lpt, rpt, i, j, curbet, bank, result[2], randwin, g;

long totbet, spins;

cerr << "Enter maximum loss ";        cin  >> maxloss;
cerr << "Enter number of trials ";    cin  >> num;
cerr << "Roulette(1) or craps(2)? ";  cin  >> g;

result[0] = 0;
result[1] = 0;
totbet    = 0;
spins     = 0;

if (g == 1)
{
    randwin = 32767 * 18/38;
}
else
{
    randwin = 32767 * 244 / 495;
}

for (i = 1; i <= num; i++)
{
    bank =  0;
    lpt  =  1;
    rpt  = 10;

    for (j = 1; j <= 10; j++)
    {
        bet[j] = 1;
    }

    do
    {
        if (rpt == lpt)
        {
            curbet = bet[rpt];
        }
        else
        {
            curbet = bet[lpt] + bet[rpt];
        }

        while ((maxloss+bank < curbet)&&(maxloss+bank > 0))
        {
            spins++;

            if (maxloss + bank >= bet[lpt])
            {
                totbet += bet[lpt];

                if (rand() <= randwin)
                {
                    bank += bet[lpt];
                    lpt++;
                }
                else
                {
                    bank     -= bet[lpt];
                    bet[lpt] *= 2;
                }
            }
            else
            {
                totbet += (maxloss + bank);

                if (rand() <= randwin)
                {
                    bet[lpt] -= (maxloss + bank);
                    bank     += (maxloss + bank);
                }
                else
                {
                    bank     -= (maxloss + bank);
                }
            }

            if (rpt == lpt)
            {
                curbet = bet[rpt];
            }
            else
            {
                curbet = bet[lpt] + bet[rpt];
            }
        }

        if (maxloss + bank > 0)
        {
            totbet+=curbet;
            spins++;

            if (rand() <= randwin)
            {
                lpt++;
                rpt--;
                bank     += curbet;
            }
            else
            {
                rpt++;
                bet[rpt]  = curbet;
                bank     -= curbet;
            }
        }
    }
    while ((lpt <= rpt) && (maxloss + bank > 0));

    if (maxloss + bank == 0)
    {
        result[1]++;
    }
    else
    {
        result[0]++;
    }

    if (i % 100000 == 0)
    {
        cerr << i << "\n";
    }
}

cerr << "Maximum loss: "        << maxloss << "\n";
cerr << "Probability of loss: " << (float)(result[1])/(float)(num) << "\n";
cerr << "Average spins: "       << (float)(spins)/(float)(num) << "\n";
cerr << "Average bet: "         << (float)(totbet)/(float)(num)<<"\n";
cerr << "Wins: "                << result[0]<<"\nLosses: "<<result[1]<<"\n";
cerr << "Total bet: "           << totbet<<"\n";
cerr << "Total win/loss: "      << (result[0]*10)-(result[1]*maxloss) << "\n";
cerr << "Total spins: "         << spins << "\n";
cerr << "Net loss: "            << (float)((result[0]*10)-(result[1]*maxloss))/(float)totbet << "\n";
}