2013-02-23 2 views
0

У меня такая же проблема, как здесь Distributed probability random number generator но в C++. Я знаю, как это реализовать, но мой вопрос: это функциональная сборка в текущей версии C++?Случайный генератор из вектора с распределением вероятности в C++

+0

Там должно быть что-то здесь для вас: http://en.cppreference.com/w/cpp/numeric/random – jrok

+3

Http: //en.cppreference.com/w/cpp/numeric/random/discrete_distribution thats it! Почему я не видел его впервые? Хорошо, спасибо. Ваш ответ помог мне. – Houp

+0

И unfortunatelly Visual Studio не поддерживает конструктор с итераторами. (dist (someVector.begin(), someVector.end()) :( – Houp

ответ

1

Для полноты, я отвечу на вопрос.

Это распределение может быть создано с использованием библиотеки генерации случайных чисел C++ 11. Для этого сначала требуется посев двигателя случайных чисел (здесь я использую std::mt19937), а затем используя этот движок с распределением случайных чисел std::discrete_distribution.

Конструктор std::discrete_dstribution принимает либо диапазон итератора по последовательности весов, либо initializer_list весов. Сгенерированные числа затем взвешиваются в соответствии с соответствующим индексом в последовательности весов. То есть, если {10, 5, 1} являются весами, 0 будет производиться с вероятностью 10/(10 + 5 + 1) = 0.625 и т. Д.

Следующий код демонстрирует решение другого вопроса:

std::random_device device; 
std::mt19937 engine(device()); // Seed the random number engine 
std::discrete_distribution<> dist({150, 40, 15, 3}); // Create the distribution 

// Now generate values with: 
std::cout << (dist(engine) + 1) << std::endl;