Advertisement
Guest User

Untitled

a guest
Feb 24th, 2014
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.41 KB | None | 0 0
  1. import random
  2. from collections import defaultdict
  3.  
  4. def brodul_shuffle(deck):
  5.     nCards = len(deck)
  6.     for i in range(nCards):
  7.         j = random.randrange(nCards)
  8.         deck[i], deck[j] = deck[j], deck[i]
  9.  
  10. def python_shuffle(deck):
  11.     random.shuffle(deck)
  12.  
  13. def shuffle(deck):
  14.     # Knuth method
  15.     n = len(deck)
  16.     for i in range(n-1):
  17.         j = random.randrange(i, n)
  18.         deck[i], deck[j] = deck[j], deck[i]
  19.  
  20.  
  21. def test_shuffler(shuffler, deck='abcd', n=10000):
  22.     counts = defaultdict(int)
  23.     for _ in range(n):
  24.         input = list(deck)
  25.         shuffler(input)
  26.         counts[''.join(input)] += 1
  27.     e = n*1./factorial(len(deck))  ## expected count
  28.     ok = all((0.9 <= counts[item]/e <= 1.1) for item in counts)
  29.     max_distance = max(counts[item]/e for item in counts)
  30.     name = shuffler.__name__
  31.     print '%s(%s) %s' % (name, deck, ('ok' if ok else '*** bad ***'))
  32.     print 'max distance:', max_distance
  33.     print '    ',
  34.     # uncomment this to see distributions
  35.     # for item, count in sorted(counts.items()):
  36.     #     print "%s:%4.1f" % (item, count*100./n),
  37.     print
  38.  
  39. def test_shufflers(shufflers=[shuffle, brodul_shuffle, python_shuffle], decks=['abcdef', 'abcde', 'abcd', 'abc','ab']):
  40.     for deck in decks:
  41.         print
  42.         for f in shufflers:
  43.             test_shuffler(f, deck)
  44.  
  45. def factorial(n): return 1 if (n <= 1) else n*factorial(n-1)
  46.  
  47. test_shufflers()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement