Самая сложная математика:
на оси 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)