I have a collection that looks something like this:
[
  {
    "id": 1,
    "tier": 0
  },
  {
    "id": 2,
    "tier": 1
  },
  {
    "id": 3
    "tier": 2
  },
  {
    "id": 4,
    "tier": 0
  }
]
Is there a standard way to select n elements where the probabilty of choosing an element of the lowest tier is p, the next lowest tier is (1-p)*p, and so on, with standard random selection of element?
So for example, if the most likely thing happens and I run the query against the above example with n = 2 and any p > .5 (which I think will always be true), then I'd get back [{"id": 1, ...}, {"id": 4}]; with n = 3, then [{"id": 4}, {"id": 1}, {"id": 2}], etc. 
E.g. here's some pseudo-Python code given a dictionary like that as objs:
def f(objs, p, n):
  # get eligible tiers
  tiers_set = set()
  for o in objs:
    eligible_tiers.add(o["tier"])
  tiers_list = sorted(list(tiers_set))
  # get the tier for each index of results
  tiers = []
  while len(tiers) < min(n, len(obis)):
    tiers.append(select_random_with_initial_p(eligible_tiers, p))
  # get res
  res = []
  for tier in tiers:
    res.append(select_standard_random_in_tier(objs, tier)
  return res
 
     
    