MathGroup Archive 2002

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: D&D Dice

  • To: mathgroup at smc.vnet.net
  • Subject: [mg37531] Re: [mg37457] D&D Dice
  • From: Daniel Lichtblau <danl at wolfram.com>
  • Date: Sun, 3 Nov 2002 02:59:05 -0500 (EST)
  • References: <200210310940.EAA18264@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

AngleWyrm wrote:
> 
> Consider yer basic 3d6 stat roll: What are the possibilities?
> This gives a table of all 6^3 = 216 rolls:
> 
> Table[i + i2 + i3, {i, 6}, {i2, 6}, {i3, 6}] // MatrixForm
> 
> My question is this: How shall I set up a formula to list the count of each
> total?

One approach might be to mess with elements of
(x[1]+x[2]+x[3]+x[4]+x[5]+x[6])^3. The code below will do this. I'm sure
it can be made more efficient e.g. by cutting down on use of pattern
matching.

ddice[sides_,n_] := Module[
	{x,sum,pow,ll1,ll2,ll3,ll4,ll5},
	sum = Apply[Plus, Array[x,sides]];
	pow = Expand[sum^n];
	ll1 = Apply[List,pow];
	ll2 = ll1 /. x[j_]^k_. -> ll[k*j];
	ll3 = ll2 //. {ll[j_]*ll[k_] -> ll[j+k], ll[j_]^k_->ll[k*j]};
	ll4 = ll3 /. a_.*ll[b_] -> {b,a};
	ll5 = Split[Sort[ll4], #1[[1]]==#2[[1]]&];
	Map[{#[[1,1]],Apply[Plus,Map[#[[2]]&,#]]}&, ll5]
	]
Example:

In[17]:= ddice[6,3]
Out[17]= {{3, 1}, {4, 3}, {5, 6}, {6, 10}, {7, 15}, {8, 21}, {9, 25}, 
  {10, 27}, {11, 27}, {12, 25}, {13, 21}, {14, 15}, {15, 10}, {16, 6}, 
  {17, 3}, {18, 1}}

The efficiency is not terrible. It will handle 9 throws of dice with 10
sides in around 11 seconds on my machine.

In[18]:= InputForm[Timing[ddice[10,9]]]
Out[18]//InputForm= 
{10.76*Second, {{9, 1}, {10, 9}, {11, 45}, {12, 165}, {13, 495}, {14,
1287}, 
  {15, 3003}, {16, 6435}, {17, 12870}, {18, 24310}, {19, 43749}, {20,
75501}, 
  {21, 125565}, {22, 202005}, {23, 315315}, {24, 478731}, {25, 708444}, 
  {26, 1023660}, {27, 1446445}, {28, 2001285}, {29, 2714319}, {30,
3612231}, 
  {31, 4720815}, {32, 6063255}, {33, 7658190}, {34, 9517662}, {35,
11645073}, 
  {36, 14033305}, {37, 16663185}, {38, 19502505}, {39, 22505751}, 
  {40, 25614639}, {41, 28759500}, {42, 31861500}, {43, 34835625}, 
  {44, 37594305}, {45, 40051495}, {46, 42126975}, {47, 43750575}, 
  {48, 44865975}, {49, 45433800}, {50, 45433800}, {51, 44865975}, 
  {52, 43750575}, {53, 42126975}, {54, 40051495}, {55, 37594305}, 
  {56, 34835625}, {57, 31861500}, {58, 28759500}, {59, 25614639}, 
  {60, 22505751}, {61, 19502505}, {62, 16663185}, {63, 14033305}, 
  {64, 11645073}, {65, 9517662}, {66, 7658190}, {67, 6063255}, {68,
4720815}, 
  {69, 3612231}, {70, 2714319}, {71, 2001285}, {72, 1446445}, {73,
1023660}, 
  {74, 708444}, {75, 478731}, {76, 315315}, {77, 202005}, {78, 125565}, 
  {79, 75501}, {80, 43749}, {81, 24310}, {82, 12870}, {83, 6435}, {84,
3003}, 
  {85, 1287}, {86, 495}, {87, 165}, {88, 45}, {89, 9}, {90, 1}}}

I wonder if there are faster direct approaches using e.g. multinomial
coefficients?


Daniel Lichtblau
Wolfram Research


  • Prev by Date: Re: ListCorrelate
  • Next by Date: HP LaserJet 3100, Windows XP and Mathematica 4.x
  • Previous by thread: RE: D&D Dice
  • Next by thread: AspectRatio->Automatic in multiple plot arrays?