MathGroup Archive 2001

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

Search the Archive

Re: shuffling a deck of cards

Peter Dimitriou wrote:
> To Whom it may concern,
> the following is a deck of cards that needs to be shuffled, how would
> I do this using the Sort Command
> Clubset=Array[clubs, 13]
> {clubs[1],clubs[2],clubs[3],clubs[4],clubs[5],clubs[6],clubs[7],clubs[8],
>   clubs[9],clubs[10],clubs[11],clubs[12],clubs[13]}
> Diamondset=Array[diamonds, 13]
> {diamonds[1],diamonds[2],diamonds[3],diamonds[4],diamonds[5],diamonds[6],
>   diamonds[7],diamonds[8],diamonds[9],diamonds[10],diamonds[11],diamonds[12],
>   diamonds[13]}
> Spadeset=Array[Spade, 13]
> {Spade[1],Spade[2],Spade[3],Spade[4],Spade[5],Spade[6],Spade[7],Spade[8],
>   Spade[9],Spade[10],Spade[11],Spade[12],Spade[13]}
> Heartset=Array[Heart, 13]
> {Heart[1],Heart[2],Heart[3],Heart[4],Heart[5],Heart[6],Heart[7],Heart[8],
>   Heart[9],Heart[10],Heart[11],Heart[12],Heart[13]}
> FullDeck=Sort[Join[{Heartset},{Spadeset}, {Diamondset}, {Clubset}]]
> {{clubs[1],clubs[2],clubs[3],clubs[4],clubs[5],clubs[6],clubs[7],clubs[8],
>     clubs[9],clubs[10],clubs[11],clubs[12],clubs[13]},{diamonds[1],
>     diamonds[2],diamonds[3],diamonds[4],diamonds[5],diamonds[6],diamonds[7],
>     diamonds[8],diamonds[9],diamonds[10],diamonds[11],diamonds[12],
>     diamonds[13]},{Heart[1],Heart[2],Heart[3],Heart[4],Heart[5],Heart[6],
>     Heart[7],Heart[8],Heart[9],Heart[10],Heart[11],Heart[12],
>     Heart[13]},{Spade[1],Spade[2],Spade[3],Spade[4],Spade[5],Spade[6],
>     Spade[7],Spade[8],Spade[9],Spade[10],Spade[11],Spade[12],Spade[13]}}
> How do I shuffle FullDeck using the Sort Command so it is all mixed
> up?
> Peterangelo

Your input is a bit off in that there are too many levels of List. Also
why bother to Sort what you are about to shuffle? Also by convention
I'll avoid beginning symbols with a capital letter.

clubset = Array[clubs, 13]
diamondset = Array[diamonds, 13]
spadeset = Array[spade, 13]
heartset = Array[heart, 13]
fullDeck = Join[heartset,spadeset, diamondset, clubset]

Here is a standard way to shuffle that makes explicit use of Sort.

shuffle1[deck_List] :=
	Map[#[[2]]&, Sort[Transpose[{Table[Random[],{Length[deck]}],deck}]]]

An equivalent but faster variation (equivalent to something shown by
Allan Hayes in a related note) uses sorting implicitly in Ordering.

shuffle2[deck_List] :=

In[47]:= SeedRandom[1111]

In[48]:= s1 = shuffle1[fullDeck];

In[49]:= SeedRandom[1111]

In[50]:= s2 = shuffle2[fullDeck];

In[51]:= s1===s2
Out[51]= True

Here is an asymptotically faster method. We iterate over a list,
successively swapping the current element with a random element between
current and end positions (inclusive). It may help if your deck has,
say, a million cards.

shuffle3 = Compile[{{n, _Integer}},
	Module[{res=Range[n], tmp, rand},
		rand = Random[Integer, {j,n}];
		tmp = res[[j]];
		res[[j]] = res[[rand]];
		res[[rand]] = tmp,
		{j, 1, n}];

I believe both methods appear in the standard add-on package
Combinatorica.m. Also both have appeared in this news group from time to

Daniel Lichtblau
Wolfram Research

  • Prev by Date: RE: can Mathematica generate itself a function?
  • Next by Date: Re: can Mathematica generate itself a function?
  • Previous by thread: shuffling a deck of cards
  • Next by thread: Re: shuffling a deck of cards