[EMAIL PROTECTED] wrote: ... > > But i am stuck on how to do a random chooser that works according to my > idea of choosing according to rating system. It seems to me to be a bit > different that just choosing a weighted choice like so: > ... > > And i am not sure i want to have to go through what will be hundreds of > sound files and scale their ratings by hand so that they all add up to > 100%. I just want to have a long list that i can add too whenever i > want, and assign it a grade/rating according to my whims! > Perhaps something like this:
from bisect import bisect_left from random import randrange def w_choice(range, weights): """Return a choice from range, given *cumulative* relative frequencies""" total = weights[-1] pick = randrange(1,total) ix = bisect_left(weights, pick) return range[ix] def cum_sum(iterable, start = 0): cum = [] for i in iterable: start += i cum.append(start) return cum Test it: >>> files = {"File1": 20, "File2": 10, "File3":70} >>> def test(files, N = 10000): ... names = files.keys() ... weights = cum_sum(files.values()) ... ... plays = {} ... for i in range(N): ... track = w_choice(names, weights) ... plays[track] = plays.get(track, 0) + 1 ... return plays ... >>> test(files, N=10000) {'File3': 7039, 'File2': 1049, 'File1': 1912} >>> files["File4"] = 50 >>> test(files, N=150000) {'File3': 70502, 'File2': 9988, 'File1': 20009, 'File4': 49501} >>> Michael -- http://mail.python.org/mailman/listinfo/python-list