2017-02-21 3 views
0

Мне нужно создать последовательность второго порядка в python.Последовательность второго порядка в python

Есть 4 факультативных случая [1,2,3,4]. Было бы здорово, если бы каждый случай происходил одинаково часто. Если это невозможно, хорошо ...

Важно отметить, что я хочу контролировать второй заказ. Это означает: в зависимости от последних двух чисел допускается только 2 числа.

Я приведу два примера: Если последовательность [...1,1,...] возможна только 3 или 4. Если последовательность [...3,4,...] возможна только 1 или 2. [У меня есть эти ограничения для всех возможностей. Конечно. Но я думаю, что когда у меня есть код для двух из них, я могу адаптировать его для остальных.]

Последовательность должна выглядеть примерно так, с длиной ок. 120 случаев: seq = [2,4,3,3,1,3,2,...]

Любые предложения по созданию такой последовательности?

+0

Имеет ли значение порядок предыдущих элементов: говорят, что последовательность «[..., 4,3, ...]» - это единственные возможности, 1 и 2. –

+0

Есть ли что-нибудь, что связано с Python, с которым мы могли бы помочь? Сейчас это не столько вопрос, сколько спецификация. – DSM

+0

@ Виллем Ван Онсем: Да, порядок имеет значение. Например.[..., 4,3, ...] только 3 и 4. [... 3,4, ...] только 1 и 2. – SDahm

ответ

1

Вы можете сначала построить словарь, который показывает возможные следующие элементы:

nexts = { 
     (1,1):(3,4), 
     (3,4):(1,2), 
     # ... 
     } 

Таким образом, это означает, что указанные предыдущие номера (1,1), то следующий элемент является одним из (3,4) (так 3 или 4). Затем мы можем сгенерировать последовательность. Поскольку вы не указали ничего о первых числах, я буду считать, что это случайный. Вы можете построить:

from random import choice 

def second_order_random(k,next_dic): 
    n0 = choice(range(1,k+1)) 
    yield n0 
    n1 = choice(range(1,k+1)) 
    yield n1 
    while True: 
     (n0,n1) = (n1,choice(next_dic[(n0,n1)])) 
     yield n1 

Это бесконечный генератор, который будет давать элементы в соответствии со спецификациями вас nexts. k, с другой стороны, указывает диапазон номеров (здесь k=4). Так что, когда вы звоните second_order_random(4,nexts), вы можете генерировать последовательности вида:

3,4,2,... 
1,1,4,... 
1,1,3,... 
3,4,1,... 

Теперь вам нужно только генерировать 120 элементов из генератора и поместить их в список. Вы можете сделать это с помощью:

from iteratools import islice 

result = list(islice(second_order_random(4,nexts),120)) 

Если один делает это с:

nexts = {(1,1):(2,),(1,2):(1,2),(2,1):(1,),(2,2):(1,)} 
k = 2 

один, например, получает:

>>> list(islice(second_order_random(k,nexts),10)) 
[1, 1, 2, 2, 1, 1, 2, 2, 1, 1] 

Так nexts здесь указано, что (1,1) всегда сопровождается 2 , что (1,2) может следовать за любым числом и что (2,1) и (2,2) всегда f Охлажденный 1. Это, конечно, маленький пример, демонстрирующий, что он работает. Из-за ограничений next эти списки всегда будут срываться в конце концов. ...,1,1,2,2,1,1,2,2,1,1,2,2,...

+0

Это прекрасно работает. = {команд NEXT \t \t (1,1) :(3,4), \t \t (1,2) :(3,4), \t \t (1,3) :(1,2), \t \t (1,4) :(1,2), \t \t (2,1) :(1,2), \t \t (2,2) :(1,2), \t \t (2, 3) :(3,4), \t \t (2,4) :(3,4), \t \t (3,1) :(3,4), \t \t (3,2) :(3,4), \t \t (3,3) :(1,2), \t \t (3,4) :(1,2), \t \t (4, 1) :(1,2), \t \t (4,2) :(1,2), \t \t (4,3) :(3,4), \t \t (4,4) :(3 , 4), \t \t} – SDahm

+0

Вы также видите возможность управления частотой каждого номера. Так что каждый происходит одинаково часто? – SDahm

+0

@SDahm: он будет равномерно выбирать из следующих состояний. Это просто невозможно сделать так: что, если у вас есть 'nexts = {(1,1) :(1,), (1,2) :(1,), (2,1): (1,), (2,2) :(1)} '. В этом случае система может только генерировать их в конце. –

Смежные вопросы