Какие есть алгоритмы для выдачи результата из заданого списка с определенной вероятностью?
Самая сложная математика:
на оси x откладываете отрезки:
[0.0 .. 0.2) - Вася
[0.2 .. 0.5) - Петя
[0.5 .. 1.0) - Кузя
Генерите random  в диапазоне 0 .. 1
На чей отрезок выпало - тому и водить.
Код на Питоне:from random import random
from bisect import bisect_left

data = {"Вася": 2,
        "Петя": 3,
        "Кузя": 5}

scalefactor = sum(data.values())
names, scale = [], [0.]
for name, weight in data.items():
    names.append(name)
    scale.append(scale[-1] + weight / scalefactor)

#  посмотрим, хорошо ли работает
counter = {name: 0 for name in names}

for i in range(10000):
    x = random()
    idx = bisect_left(scale, x) - 1
    name = names[idx]
    counter[name] += 1
print(counter)
Элементарно, Ватсон.
С Вашего позволения, я переформулирую задачу.
У Вас имеется гистограмма (частоты появления) элементов. Вам необходимо, чтобы на тысячу экспериментов, у Вас частота появления заданного элемента, приближалась к некой заданной частоте из гистограммы. Тогда, берете произвольный промежуток, скажем от 1 до 1000, и делите его в пропорциях, согласно Вашей гистограмме. Например. У Вас 2 элемента: один появляется с частотой 2/3, второй с частотой 1/3. Тогда делим промежуток от 1-1000 на 2 куска, один от 1 до ~300, второй от ~301 до 1000. В зависимости от того, на какой участок попала случайно сгенерированная величина, тот элемент и берете.