Страницы

Поиск по вопросам

суббота, 23 марта 2019 г.

Шансы и варианты

Есть несколько функций, и меняющиеся шансы для их вызова:
void a() { } void b() { } void c() { }
float aChance = 0.3f; float bChance = 0.1f; float cChance = 0.6f;
Я понимаю, что нужно сгенерировать шанс (0.0f - 1.0f) и сравнить с aChance, bChance и cChance. Но тогда, если шансы двух переменных одинаковы, вызываться будет та функция, которая первой стоит в if-else if-else.
Какой здесь нужен алгоритм? Спасибо!


Ответ

Задача может решаться с помощью стандартного шаблона распределения std::discrete_distribution
std::discrete_distribution<> dist({ список вероятностей }); std::cout << dist(генератор);
Пример использования:
#include #include #include
int main() { std::random_device rd; std::mt19937 gen(rd()); std::discrete_distribution<> dist({ 0.3, 0.1, 0.6 });
std::map m; for (int n = 0; n < 10000; ++n) ++m[dist(gen)];
for (auto p : m) std::cout << p.first << " generated " << p.second << " times
"; }
0 generated 2980 times 1 generated 1002 times 2 generated 6018 times
Ссылка на рабочий пример.

Комментариев нет:

Отправить комментарий