Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 25, 2016 23:04:18

jon34
Зарегистрирован: 2016-02-14
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерация строки со случайными символами

Есть набор символов и для каждого задана вероятность его появления. На основе этих данных нужно построить строку. Подскажите как это можно сделать, пока просто не понимаю по какому алгоритму это можно сделать.

Офлайн

#2 Сен. 25, 2016 23:34:11

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Генерация строки со случайными символами

Это задача на генерацию дискретной случайной величины
генерируете случайное число от 0 до 1 на этом отрезке выбираете интервалы пропорциональные вероятности события и смотрите в какой интервал попала реализация.



Офлайн

#3 Сен. 26, 2016 02:55:59

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Генерация строки со случайными символами

Если вероятности заданы “не очень точно” (например, с точностью до 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.

Отредактировано scidam (Сен. 26, 2016 03:04:35)

Офлайн

#4 Сен. 26, 2016 07:31:45

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Генерация строки со случайными символами

scidam
использовать такое решение:
У такого решения есть конструктивный недостаток. Перегенерация массива символов при каждом выборе буквы. Это можно поправить если передать длину строки вторым аргументом и делать всю строку внутри функции. Но я думаю генератор последовательности букв более в духе питона.

 def lett_seq(prob_dict):
    ....
    while True:
     ....
         yield next_letter



Офлайн

#5 Сен. 27, 2016 13:18:35

jon34
Зарегистрирован: 2016-02-14
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерация строки со случайными символами

Огромное спасибо. Оформил код вот так:

 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)])

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version