Не уверен в своем решении. Кажется, что это будет работать, хотя. Вот как я бы подошел к этому, даже если это немного избыточно - я бы начал с таблицы только для справки:
density | probability of obstacle
---------------------------------
0 | 0%
1 | 10%
2 | 20%
3 | 30%
4 | 40%
5 | 50%
6 | 60%
7 | 70%
8 | 80%
9 | 90%
10 | 100%
Это, кажется, складывается. Я представляю две версии функции, которая возвращает True
или False
в зависимости от density
. В первой версии я использую density
для создания связанных весов, которые будут использоваться с random.choices
(общий вес в этом случае будет 100). Например, если density = 3
, то weights = [30, 70]
- 30% будет True
, 70% будет False
.
def get_obstacle_state_version_1(density):
from random import choices
assert isinstance(density, int)
assert density in range(0, 11) # 0 - 10 inclusive
true_weight = density * 10
false_weight = 100 - true_weight
weights = [true_weight, false_weight]
return choices([True, False], weights=weights, k=1)[0]
Вот вторая версия, в которой я использую random.choice
а не random.choices
. Последний всегда возвращает список выборок, даже если размер выборки k
равен 1. Здесь идея та же, но в основном плотность влияет на число True
с и False
с, которые появляются в популяции быть выбранным Например, если density = 3
, то random.choice
выберет один элемент из списка 30 True
с и 70 False
с с равномерным распределением.
def get_obstacle_state_version_2(density):
from random import choice
assert isinstance(density, int)
assert density in range(0, 11) # 0 - 10 inclusive
true_count = density * 10
false_count = 100 - true_count
return choice([True] * true_count + [False] * false_count)