Skip to content

Instantly share code, notes, and snippets.

@mikkkee
Last active August 29, 2015 14:23
Show Gist options
  • Save mikkkee/0e9628e8a19399ca45dc to your computer and use it in GitHub Desktop.
Save mikkkee/0e9628e8a19399ca45dc to your computer and use it in GitHub Desktop.
A combination problem. Put balls into pockets, each can hold up to 2 balls, randomly. Get the average percentage of balls that are inside full pockets.
import random
class Pocket(object):
"""A pocket can hold up to 2 balls."""
def __init__(self, num):
self.num = num
self.member = []
self.limit = 2
@property
def is_full(self):
return len(self.member) == self.limit
def add_member(self, member):
if self.is_full:
raise Exception('Pocket is full')
self.member.append(member)
return self.member
def seed_balls(nballs, npockets):
"""Put balls into pockets randomly."""
# Generate pockets.
available_pockets = []
full_pockets = []
for i in range(npockets):
available_pockets.append(Pocket(i))
for i in range(nballs):
selected = random.sample(available_pockets, 1)[0]
selected.add_member(i)
if selected.is_full:
full_pockets.append(selected)
del available_pockets[available_pockets.index(selected)]
return len(full_pockets)
def ave(n, nballs, npockets):
"""Perform n independent runs to obtain average percentage of balls
that are in full pockets.
"""
ave_full = 0
for i in range(n):
ave_full += seed_balls(nballs, npockets)
print(ave_full * 2.0 / n / nballs)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment