Если вероятности заданы “не очень точно” (например, с точностью до 2-х- десятичных знаков), можно использовать такое решение:
import random
probs = {'A': 0.3, 'B': 0.4, 'C': 0.3}
def get_random(probs):
return random.choice(sum([[key] * int(probs[key] * 100) for key in probs], []))
yourstrlen = 20
yourstr = ''.join([get_random(probs) for k in range(yourstrlen)])
По сути, это генерация массива из 100 элементов, где 30 - A, 40 - B, 30 - C и случайный выбор одного элемента из этого массива. Далее, строим строку, yourstr, длиной, допустим 20.