Как случайным образом выбирать значения для списка?
Я использую Python 2.7
Чтобы быть ясным, я не хочу рандомизировать элементы в списке. Я хочу сделать так, чтобы некоторые струны вообще не появлялись. Например:
r = "red"
b = "blue"
y = "yellow"
rc = random colour
myColours = [rc,rc,rc]
print myColours
Очевидно, что код выше не будет работать, но я не уверен, как продолжить. Это также помогло бы, если бы я мог изменить, насколько вероятна определенная строка, например, 50% шансов красного, 30% шансов синего и 20% шансов желтого.
Ответы
Ответ 1
Вы можете использовать numpy.random.choice
. Параметр p
позволяет указать вероятности, связанные с каждой записью.
import numpy as np
r, b, y = 'red', 'blue', 'yellow'
my_colours = np.random.choice(a=[r, b, y], size=3, p=[.5, .3, .2])
print(my_colours) . # my_colours.tolist() if you want list output
# ['yellow' 'red' 'red']
Чтобы подтвердить, что это работает, используйте результат размером 30 000, а не 3, и пусть закон больших чисел сделает свое дело.
from collections import Counter
test = np.random.choice(a=[r, b, y], size=30000, p=[.5, .3, .2])
counts = Counter(test)
# Relative occurences:
dict(zip(counts.keys(), [count/30000 for count in counts.values()]))
{'blue': 0.30483333333333335,
'red': 0.5000333333333333,
'yellow': 0.19513333333333333}
Ответ 2
Хотя это не поможет OP, использующему Python 2.7, для тех, кто использует Python 3.6, random.choices
прост, включает в себя вес и часть стандартной библиотеки.
Возвращает список элементов размера, выбранный из группы с заменой.
Учитывая
import random
r = "red"
b = "blue"
y = "yellow"
iterable = r, b, y
size = 3
wts = [.5, .3, .2]
код
random.choices(iterable, k=size)
# ['red', 'yellow', 'yellow']
random.choices(iterable, weights=wts, k=size)
# ['red', 'red', 'red']