turn on suggestions

Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

Find a Community

- Home
- /
- SAS Programming
- /
- Base SAS Programming
- /
- Craps - Game Simulation

Topic Options

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

11-30-2011 03:42 PM

Hi,

If you can't tell from my recent rash of posts I am having a slow week...

Craps is a gambling game:

1. The game is played with 2 dice

2. If the pips on the dice total 2, 3 or 12 the player loses

3. If the pips on the dice total 7 or 11, the player wins

4. If the pips total 4, 5, 6, 8, 9 or 10 the total pips establishes the 'point.' The player continues to roll until he rolls the point (wins) or rolls a 7 (loses)

Write a program that simulates a game of craps, calculate various statistics from the game:

A. Most Common Roll

B. Win Percentage

C. Number of Rolls/Game

D. Maximum Rolls/Game

E. Whatever else you can think of...

FROM WIKIPEDIA: http://en.wikipedia.org/wiki/Craps

Bank craps is a game played by multiple players betting against a casino. Each casino might set slightly different payouts for the various bets. Players take turns rolling two dice and whoever is throwing the dice is called the "shooter". Players can bet on the various options by placing chips in the appropriate sections of the board. It may be required to ask the dealer to place certain bets.

While acting as the shooter, a player must have a bet on the **"Pass" line** or the **"Don't Pass" line**. Pass and don’t pass are sometimes called "Win" and "Don’t Win" or "Right" and "Wrong" bets. The game is played in rounds and these "Pass" and "Don't Pass" bets are betting on the outcome of a round. The shooter is often replaced at the end of the round or when they lose a round with a seven. The dice are moved clockwise around the table for the next player to become shooter. The shooter is presented with multiple dice (typically five) by the "stickman", and must choose two for the round. The remaining dice are returned to the stickman's bowl and are not used.

Each round has two phases: "come-out" and "point". To start a round, the shooter makes one or more "come-out" rolls. A come-out roll of 2, 3 or 12 loses and is called "craps". Anyone betting on the Pass line loses in this situation. A come-out roll of 7 or 11 (a "natural") wins and results in a payout for "pass line" bets. The other possible numbers are the point numbers: 4, 5, 6, 8, 9, and 10. If the shooter rolls one of these numbers on the come-out roll, this establishes the **"point"** - the number that must be rolled again before a seven. The dealer flips a button to the "On" side and moves it to the point number signifying the second phase of the round. If the shooter rolls a seven before repeating the point number (a "seven-out"), the Pass line loses and the round ends.

1 | 2 | 3 | 4 | 5 | 6 | |
---|---|---|---|---|---|---|

1 | Snake Eyes | Ace Deuce | Easy Four | Five (Fever Five) | Easy Six | Natural or Seven Out |

2 | Ace Deuce | Hard Four | Five (Fever Five) | Easy Six | Natural or Seven Out | Easy Eight |

3 | Easy Four | Five (Fever Five) | Hard Six | Natural or Seven Out | Easy Eight | Nine (Nina) |

4 | Five (Fever Five) | Easy Six | Natural or Seven Out | Hard Eight | Nine (Nina) | Easy Ten |

5 | Easy Six | Natural or Seven Out | Easy Eight | Nine (Nina) | Hard Ten | Yo (Yo-leven) |

6 | Natural or Seven Out | Easy Eight | Nine (Nina) | Easy Ten | Yo (Yo-leven) | Boxcars or Midnight |

SPOILER: Below is my blacked-out answer

options fullstimer macrogen symbolgenmlogic mprint;

%let games=500000;

**%macro** ** roll**;

rolls+**1**;

%do i=**1** %to **2**;

roll&i=rand('table',**1**/**6**,**1**/**6**,**1**/**6**,**1**/**6**,**1**/**6**,**1**/**6**);

%end;

pips=sum(of roll1-roll2);

call sortn(roll1,roll2);

if rol.find()=**0** then

do;

n+**1**;

rol.replace();

end;

else

do;

n=**1**;

rol.add();

end;

**%mend**;

**data** _null_;

declare hash ga(ordered:'a');

ga.definekey('rolls','i');

ga.definedata('i','rolls','win','loss');

ga.definedone();

declare hash rol();

rol.definekey('roll1','roll2');

rol.definedata('roll1','roll2','n');

rol.definedone();

do i=**1** to &games;

rolls=**0**;

point=**.**;

%*roll*

win=ifn(pips in (**2**,**3**,**12**),**1**,**0**);

loss=ifn(pips in (**7**,**11**),**1**,**0**);

if pips in (**4**,**5**,**6**,**8**,**9**,**10**) then

do;

point=pips;

do until(win or loss);

%*roll*

loss=ifn(pips=point,**1**,**0**);

win=ifn(pips=**7**,**1**,**0**);

end;

ga.add();

end;

else ga.add();

end;

declare hiter iga('ga');

declare hiter irol('rol');

max=**0**;

irol.first();

do while(irol.next()=**0**);

max=ifn(max<n,n,max);

if max=n then

do;

r1=roll1;

r2=roll2;

end;

end;

put 'Most Common Roll: ' r1 ' / ' r2 ' with ' n comma8. ' rolls';

tot=**0**;

wins=**0**;

winsx=**0**;

gamesx=**0**;

iga.last();

put 'Longest game: ' rolls 'rolls';

do while(iga.prev()=**0**);

tot+rolls;

wins+win;

if rolls>**1** then

do;

gamesx+**1**;

winsx+win;

end;

end;

avg=tot/&games;

wpct=wins/&games;

wpctx=winsx/gamesx;

put 'Total Rolls Processed: ' tot comma12.;

put 'Average Rolls per Game: ' avg;

put 'Win Percentage: ' wpct percent8.2;

put 'Probability of Winning a Game with More than 1 roll: ' wpctx percent8.2;

**run**;

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

Posted in reply to FriedEgg

12-18-2013 08:58 AM

Those who have my book *Statistical Programming with SAS/IML Software *can find a PROC IML solution on pp 322-327. The code is available as a free download from the book's Web page.