#!/usr/bin/env python #-*- coding:utf-8 -*- # """ Demonstrate number of hands needed to pick Ace of Spades from a shuffled pack of cards. The best case is 1, the worst is infinity. Lets see.... """ try: import sys from random import Random r = Random() except Exception,rand_load: print "Some error occured in random init\n%s" % ( rand_load) sys.exit() def shuffle_pack(): """ Generate an unmixed deck and shuffle it. """ cards = ['spades_ace', 'spades_two', 'spades_three', 'spades_four', 'spades_five', 'spades_six', 'spades_seven', 'spades_eight', 'spades_nine', 'spades_ten', 'spades_jack', 'spades_queen', 'spades_king', 'hearts_ace', 'hearts_two', 'hearts_three', 'hearts_four', 'hearts_five', 'hearts_six', 'hearts_seven', 'hearts_eight', 'hearts_nine', 'hearts_ten', 'hearts_jack', 'hearts_queen', 'hearts_king', 'clubs_ace', 'clubs_two', 'clubs_three', 'clubs_four', 'clubs_five', 'clubs_six', 'clubs_seven', 'clubs_eight', 'clubs_nine', 'clubs_ten', 'clubs_jack', 'clubs_queen', 'clubs_king', 'diamonds_ace', 'diamonds_two', 'diamonds_three', 'diamonds_four', 'diamonds_five', 'diamonds_six', 'diamonds_seven', 'diamonds_eight', 'diamonds_nine', 'diamonds_ten', 'diamonds_jack', 'diamonds_queen', 'diamonds_king'] shuffled = [] while not len( shuffled ) == 52: shuffled.append( cards.pop( r.randint( 0, len( cards ) - 1 ) ) ) return shuffled def pick_card( pack ): """ Keep picking cards from random positions until you hit the Ace of Spades. Return the hands needed """ count, result = 0, 0 while result == 0: if pack[ r.randint( 0, 51 ) ] == 'spades_ace': return count else: count += 1 if __name__ == '__main__': average, lowest, highest = 0, 999999, 0 for i in range( 1000 ): iterations = pick_card( shuffle_pack() ) average += iterations if iterations < lowest: lowest = iterations if iterations > highest: highest = iterations print "Iterations: 1000\nHighest: %s\nLowest: %s\nAverage: %s" % ( highest + 1, lowest + 1, average / 1000 )