Я пытаюсь понять, как предполагается использовать функции генерации случайных чисел С++ 11. Меня беспокоит производительность.
Предположим, что нам нужно создать ряд случайных чисел между 0..k
, но k
изменяется на каждом шаге. Каков наилучший способ продолжения?
Пример:
for (int i=0; i < n; ++i) {
int k = i; // of course this is more complicated in practice
std::uniform_int_distribution<> dist(0, k);
int random_number = dist(engine);
// do something with random number
}
Распределения, которые предоставляет заголовок <random>
, очень удобны. Но они непрозрачны для пользователя, поэтому я не могу легко предсказать, как они будут работать. Не ясно, например, сколько (если таковые имеются) служебных данных времени выполнения будут вызваны конструкцией dist
выше.
Вместо этого я мог бы использовать что-то вроде
std::uniform_real_distribution<> dist(0.0, 1.0);
for (int i=0; i < n; ++i) {
int k = i; // of course this is more complicated in practice
int random_number = std::floor( (k+1)*dist(engine) );
// do something with random number
}
который позволяет избежать создания нового объекта на каждой итерации.
Случайные числа часто используются в численных симуляциях, где важна производительность. Каков наилучший способ использования <random>
в этих ситуациях?
Пожалуйста, не отвечайте "profile it". Профилирование является частью эффективной оптимизации, но это хорошее понимание того, как предполагается использовать библиотеку и характеристики производительности этой библиотеки. Если ответ заключается в том, что он зависит от стандартной реализации библиотеки или что единственный способ узнать, это профилировать его, то я бы предпочел не использовать дистрибутивы из <random>
вообще. Вместо этого я могу использовать свою собственную реализацию, которая будет прозрачной для меня и намного легче оптимизировать, если при необходимости.