Online File
Rick Aster: Professional SAS Programming Shortcuts: Contents
DATA WORK.RISK1 (KEEP=D_DICE A_DICE OUTCOME COMPRESS=NO); LENGTH D_DICE A_DICE 3 OUTCOME $ 2; RETAIN N 10000; DO D_DICE = 1 TO 2; * Number of defending dice; DO A_DICE = 1 TO 3; * Number of attacking dice; ARMIES = A_DICE MIN D_DICE; * Number of armies decided; DO I = 1 TO N; ROLL_D1 = CEIL(6*RANUNI(7)); * Defending dice roll; IF D_DICE >= 2 THEN ROLL_D2 = CEIL(6*RANUNI(7)); ELSE ROLL_D2 = 0; DEFEND1 = LARGEST(1, OF ROLL_D1-ROLL_D2); *Defending dice, sorted; DEFEND2 = LARGEST(2, OF ROLL_D1-ROLL_D2); ROLL_A1 = CEIL(6*RANUNI(7)); * Attacking dice; IF A_DICE >= 2 THEN ROLL_A2 = CEIL(6*RANUNI(7)); ELSE ROLL_A2 = 0; IF A_DICE >= 3 THEN ROLL_A3 = CEIL(6*RANUNI(7)); ELSE ROLL_A3 = 0; ATTACK1 = LARGEST(1, OF ROLL_A1-ROLL_A3); ATTACK2 = LARGEST(2, OF ROLL_A1-ROLL_A3); * Count results; IF ARMIES = 1 THEN SELECT (ATTACK1 > DEFEND1); WHEN (1) OUTCOME = ' A'; OTHERWISE OUTCOME = ' D'; END; ELSE SELECT ((ATTACK1 > DEFEND1) + (ATTACK2 > DEFEND2)); WHEN (2) OUTCOME = 'AA'; WHEN (1) OUTCOME = 'AD'; OTHERWISE OUTCOME = 'DD'; END; OUTPUT; END; END; END; STOP; RUN; PROC TABULATE DATA=WORK.RISK1 FORMCHAR=' '; CLASS D_DICE A_DICE OUTCOME; TABLE D_DICE*A_DICE, OUTCOME*ROWPCTN*F=7.3 / RTSPACE=15 BOX='A=Attacker D=Defender'; KEYLABEL ROWPCTN=' '; RUN;