Форум сайта python.su
0
Есть набор символов и для каждого задана вероятность его появления. На основе этих данных нужно построить строку. Подскажите как это можно сделать, пока просто не понимаю по какому алгоритму это можно сделать.
Офлайн
253
Это задача на генерацию дискретной случайной величины
генерируете случайное число от 0 до 1 на этом отрезке выбираете интервалы пропорциональные вероятности события и смотрите в какой интервал попала реализация.
Офлайн
35
Если вероятности заданы “не очень точно” (например, с точностью до 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)])
Отредактировано scidam (Сен. 26, 2016 03:04:35)
Офлайн
253
scidamУ такого решения есть конструктивный недостаток. Перегенерация массива символов при каждом выборе буквы. Это можно поправить если передать длину строки вторым аргументом и делать всю строку внутри функции. Но я думаю генератор последовательности букв более в духе питона.
использовать такое решение:
def lett_seq(prob_dict): .... while True: .... yield next_letter
Офлайн
0
Огромное спасибо. Оформил код вот так:
def get_symbol(alphabet: dict): seq = sum([[key] * alphabet[key] for key in alphabet], []) while True: yield random.choice(seq) def generate_str(alphabet: dict, str_len: int): symbol = get_symbol(alphabet) return ''.join([next(symbol) for _ in range(str_len)])
Офлайн