Social Profiles

My Projects

Получить случайную последовательности из списка.

Задача самая обычная, и возникает достаточно часто - получить случайную последовательность, случайной длинны из какого-либо набора данных. Например, 5-10 кейвордов из списка кеев в несколько тысяч, или выбор последовательности действия для бота имитирующего поведение человека. В простейшем варианте - все элементарно :

import random
data = ['add_friends', 'post_story', 'vote', 'comment']
chain = random.sample(data, 2)

Тааак, а если хочется задать вероятность наступления события?

import random

def get_random_chain(chain, min_max=[1,1]):
    '''Get random chain from list
    chain - target list
    min_max - result chain length (from-to)
    '''

    items_chain = []
    random.seed()
    for item, num in chain.iteritems():
        items_chain.extend([item] * num)
    random.shuffle(items_chain)
    chain_len = random.randint(min_max[0], min_max[1])
    return random.sample(items_chain, chain_len)

Использовать можно следующим образом (исходная последовательность задается в виде словаря key : value - где value вероятность наступления события) :

ACTIONS = {
    "post" : 20,
    "vote" : 80
}
# Получить случайную цепочку действий длинной в данном случае от 5 до 10 элементов.
what_to_do = get_random_chain(ACTIONS, [5,10])

Обратите внимание, длинна результата может быть сколь угодно длинной и превышать исходную последовательность. Однако алгоритм далеко не оптимален и не подойдет для работы с большим объемом исходных данных.

comments powered by Disqus