Fast generation of permutations

Paul Rubin http
Wed Jan 25 16:39:24 EST 2006


Paul Rubin <http://phr.cx@NOSPAM.invalid> writes:
> Well, maybe not 24x.  The exact number is more complicated.  I'm still
> too sleepy to figure this out right now but may think about it later.

Turns out to be 7x, for reasons that are a bit mysterious.
Ignoring suits, think of the 5-card hand as a 5-digit number base 13.
There are 13**5 such numbers, but 13 of them are impossible as 5-card
deals (all 5 digits are the same, "5 of a kind").  That leaves
13**5-13 = 371280, which is 1/7th of C(52,5).  Can someone give
a combinatorial explanation?

Generating the hands is simple:

    def deals():
        for i in xrange(13**5):
            cards = [(i//p) % 13 for p in (1, 13, 169, 2197, 28561)]
            yield cards

The funny numbers in that list are the first four powers of 13.
Flattening the generator with list() takes about 8 sec on my p3-750.
Unrolling the list comprehension and making tuples instead of lists,
     cards = (i%13, (i//13)%13, (i//169)%13, (i//2197)%13, (i//28561)%13)
speeds it up to 5.6 seconds.

In categorizing the hands from this generator, you have to:

  - discard the hands that are 5-of-a-kind (there are 13 of them)

  - in hands where all 5 numbers are distinct, consider whether
    the hand might be a flush (probability is 1 in 256).



More information about the Python-list mailing list