Code:
firas@av104151 ~ % cat prob.py
import random
l = [('a', 1), ('b', 5), ('c', 5)]
def randitem(l):
# Make the probabilities add up to 1, preserving ratios
s = sum([b for (a,b) in l])
l2 = []
for (a,b) in l:
l2.append((a, b/s))
r = random.random()
for (a,b) in l2:
if r < b:
return a
else:
r -= b
# test
res = {'a':0, 'b':0, 'c':0}
for i in range(10000):
res[randitem(l)] += 1
print('a: %s (%s%%)' % (res['a'], res['a']/100))
print('b: %s (%s%%)' % (res['b'], res['b']/100))
print('c: %s (%s%%)' % (res['c'], res['c']/100))
firas@av104151 ~ % python3 prob.py
a: 895 (8.95%)
b: 4521 (45.21%)
c: 4584 (45.84%)
Bookmarks