Как выбрать случайные предметы по совокупной вероятности? - PullRequest
0 голосов
/ 24 апреля 2019

Фон упражнений

Упражнение состоит в создании 2D-карты с заданным пользователем размером x, y указанной карты, а затем размещении в каждой ячейке карты случайных элементов из таблицы. У меня есть ячейка в координате [x, y] матрицы Items, и я должен выбирать элементы случайным образом для каждой ячейки этой матрицы.

Моя проблема

Мне нужно выбрать случайные элементы из таблицы из 4 элементов, у которых их вероятности показаны в совокупной вероятности, и ячейка, имеющая такие элементы, может иметь более 1 и различные комбинации этих элементов.

Я действительно не знаю, как решить эту проблему, учитывая, что 2 предмета имеют одинаковую вероятность на заданной таблице для домашней работы.

Это таблица вероятности:

Food - 1
Weapons - 0.5
Enemy - 0.5
Trap - 0.3

Перечень моих товаров:

[Flags]
enum Items
{
    Food = 1<<0,
    Weapon = 1<<1,
    Enemy = 1<<2,
    Trap = 1<<3
}

Опять же, ожидаемый результат состоит в том, чтобы случайным образом выбирать эти проценты, какие элементы имеет 1 ячейка. То, что я хотел бы получить в качестве ответа, было бы только началом или способом решения этой проблемы, пожалуйста, я все еще хочу попробовать и сделать это сам, избегайте полных решений кода, если можете.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Мне проще работать с целыми числами в этом типе задачи, поэтому я буду работать с:

Food - 10
Weapons - 5
Enemy - 5
Trap - 3

Это дает в общей сложности 10 + 5 + 5 + 3 = 23 возможных вариантов.

Большинство компьютерных RNG работают с базы 0, поэтому разделите 23 параметра (как в 0..22) следующим образом:

Food - 0..9 giving 10 options.
Weapons - 10..14 giving 5 options.
Enemy - 15..19 giving 5 options.
Trap - 20..22 giving 3 options.

Прорабатывайте возможности по порядку, останавливаясь при достижении выбранной опции. Я буду использовать псевдокод, так как мой C ++ очень ржавый:

function pickFWET()

  pick <- randomInRange(0 to 22);

  if (pick < 10) return FOOD;
  if (pick < 15) return WEAPONS;      
  if (pick < 20) return ENEMY;
  if (pick < 23) return TRAP;

  // If we reach here then there was an error.
  throwError("Wrong pick in pickFWET");

end function pickFWET
0 голосов
/ 24 апреля 2019

Если два элемента имеют одинаковую совокупную вероятность, то вероятность получения последнего элемента равна 0. Дважды проверьте таблицу вероятностей, но если она верна, то «Оружие» не является допустимым вариантом для получения.

Однако в целом.Если бы вы могли «как-то» сгенерировать случайное число от 0 до 1, проблема была бы легкой, верно?Имея несколько условий if, вы можете выбрать один из вариантов, заданных этим случайным числом.

С помощью небольшого поиска вы легко сможете найти, как сгенерировать случайное число на любом языке, который вы пожелаете.

...