I have a list of candidates which looks like this:candidates = [    {        'name': 'John',        'rank': 13    },    {        'name': 'Joe',        'rank': 8    },    {        'name': 'Averell',        'rank': 5    },    {        'name': 'William',        'rank': 2    }]What I want to do is semi-randomly pick one of these candidates, based on its squared rank. So that a candidate A having a rank twice as big as B, will have 4 times more chances to be picked than B.Here is a naive implementation of the idea I had to solve this problem:def pick_candidate(candidates):    # initiates a global probability space    prob_space = []    # bring the max rank to 20    # to avoid useless CPU burning    # while keeping a good granularity -    # basically, just bring the top rank to 20    # and the rest will be divided proportionally    rate = candidates[0]['rank'] / 20    # fills the probability space with the indexes    # of 'candidates', so that prob_space looks like:    # [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]    # if candidates[0] has rank 3 and candidates[1] has rank 2    for i, c in enumerate(candidates):        rank = c['rank'] / rate        for j in range(int(rank*rank)):            prob_space.append(i)    # picks a random index from the probability space    picked_prob_space_index = random.randint(0, len(prob_space)-1)    # retrieves the matching candidate    picked_candidate_index = prob_space[picked_prob_space_index]    return candidates[picked_candidate_index]The questions I'm thinking of, concerning the above code, are:Concept: Is the core principle of the algorithm (the idea of building prob_space, etc) overkill and solvable more easily in other ways or with builtinsImplementation: This core principle put aside, what do you think of the implementation? Would you think of a better, cleaner way to write it?
Probabilistically pick a candidate
python;algorithm