Python случайных значений с заданной плотностью - PullRequest
0 голосов
/ 29 февраля 2020

Скажем, я хочу построить лабиринт с определенной вероятностью препятствия в каждой позиции. Эта вероятность определяется значением плотности в диапазоне от 0 до 10, где 0 означает «нет шансов», а 10 означает «определенный».

Этот код Python выполняет то, что я хочу?

import random

obstacle_density = 10
if random.randint(0, 9) < obstacle_density:
    print("There is an obstacle")

Я пробовал различные комбинации верхних и нижних границ и неравенств, и это, кажется, делает работу, но я с подозрением. С одной стороны, 11 возможных значений для obstacle_density и только 10 для random.randint(0, 9).

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Вы должны l oop над лабиринтом и на каждом сайте назначить вероятность. Вы должны сделать что-то вроде этого:

probability = random.randint(0, 10) / 10

Я понятия не имею, что вы подразумеваете под obstacle_density, поэтому я не собираюсь go там.

0 голосов
/ 29 февраля 2020

Не уверен в своем решении. Кажется, что это будет работать, хотя. Вот как я бы подошел к этому, даже если это немного избыточно - я бы начал с таблицы только для справки:

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)
...