import random
def ShuffleBag(items, seed=None):
"""Create a new shuffled bag using the elements in items.
Items can be a dict of (item : frequency) pairs, or an iterable.
"""
try:
items = sum(([item] * freq for (item, freq) in items.items()), [])
except AttributeError:
items = list(items)
random.seed(seed)
while True:
n = len(items)
for i in range(n):
grab = random.randint(i, n-1)
items[i], items[grab] = items[grab], items[i]
yield items[i]
sb = ShuffleBag([1, 2, 2, 2])
print sb.next() # 1 - 25%, 2 - 75%
sb = ShuffleBag({1:1, 2:3})
print sb.next() #1 - 25%, 2 - 75%