Поместите 2 значения в массив случайным образом с определенной вероятностью - PullRequest
2 голосов
/ 19 июня 2020

Я хотел создать случайный массив длиной 24 дюйма python, назначив значения списка seq=[30,170]. Итак, я хотел иметь массив, который выглядит как a=[30,30,30,170,30,170,...]. Проблема в том, что значения следует присваивать не полностью случайным образом, а с определенной вероятностью. В этом случае, если первое значение равно 30 (или 170), вероятность того, что следующее значение также будет 30 (или 170), должна быть 90%, а вероятность того, что следующее значение будет 170 (или 30), должна быть 10%.

Кто-нибудь знает, как это сделать? На данный момент я только нашел, как расположить их случайным образом. Спасибо !!

import random
seq=[30,170] 
a = random.choices(seq,k=24) 

1 Ответ

2 голосов
/ 19 июня 2020

Вы можете указать веса для random.choices (совокупность, веса = None, *, cum_weights = None, k = 1) .

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

import random

seq = [30, 170] 

# weight lookup
wgt = {30: (90, 10), 170:(10, 90)}

r = []

for _ in range(24):
    if not r:
        # need some initial value: 50/50
        r.append(random.choice(seq))
    else:          
        # k == 1, using correct weights from lookup, use only single value and add it
        r.append(random.choices(seq, weights=wgt[r[-1]], k=1)[0])

print(r)

Вывод за 8 прогонов:

[170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170]

[30, 30, 30, 30, 30, 30, 170, 170, 170, 170, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]

[30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]

[30, 30, 30, 30, 30, 170, 170, 170, 170, 170, 170, 170, 170, 30, 30, 170, 170, 170, 170, 170, 170, 170, 170, 170]

[170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 30, 30, 30, 170, 170, 170, 170]

[170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 30, 30, 30, 30, 30, 30, 30, 30, 30]

[30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]

[30, 30, 170, 170, 30, 170, 170, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]

Вы также можете сами указать вес:

seq = [30,170]
w = {30: (30,30,30,30,30,30,30,30,30,170),           # if  30: use 9 * 30 + 1 * 170
     170:(30,170,170,170,170,170,170,170,170,170)}   # if 170: use 9 * 170 + 1 * 30

r = []
for _ in range(24):
    if not r:
        r.append(random.choice(seq))
    else:          
        r.append(random.choice(w[r[-1]])) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...