Как получить случайное число эффективным способом с C ++ - PullRequest
0 голосов
/ 18 марта 2019

Я использовал boost и QuantLib для создания «массива», содержащего случайные числа (стандартное нормальное распределение).Тем не менее, я заметил, что производительность вычислений была не очень желательна, и скорость была намного ниже, чем просто использование numpy из python.Кто-нибудь может дать мне несколько советов?Большое спасибо.

Вот мой код на C ++:

using namespace QuantLib;
Array generateRandNumbers(unsigned long seed, Size n) { 
    Array res(n);
    boost::mt19937 rnd(seed); 
    boost::normal_distribution<> normDist(0, 1); 
    boost::variate_generator<boost::mt19937&, boost::normal_distribution<>> generator_norm(rnd, normDist); 
    BOOST_FOREACH(Real& x, res) x = generator_norm();

    return res;
}

int main() 
{
    unsigned long seed = 1; 
    Size n = 1e6;
    boost::timer timer;
    Array randNumbers = generateRandNumbers(seed, n); 
    std::cout << timer.elapsed() << std::endl; 
    return 0
}

А это мой код на Python:

import numpy as np
import time

ts = time.time()
res = np.random.normal(0, 1, 1000000); 
print(time.time() - ts)

1 Ответ

0 голосов
/ 18 марта 2019

Вы спросили:

Может кто-нибудь дать мне несколько советов?

Язык программирования вряд ли будет играть главную рольВот.Поэтому этот вопрос сводится к другим параметрам:

  1. Используемый алгоритм случайных чисел (например, Mersenne Twister)
  2. Детали реализации алгоритма, которые могут влиять на производительность
  3. Каккод компилируется, связывается и запускается.(выпуск, отладка, оптимизация компилятора)

Что касается последнего пункта - убедитесь, что при сравнении вы всегда используете оптимизированную сборку релиза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...