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 builtins
- **Implementation**: This core principle put aside, what do you think of the implementation? Would you think of a better, cleaner way to write it?