Я пытаюсь найти наиболее эффективный способ генерации случайных чисел для моделирования MC, над которым я работаю. Я много читал о алгоритме двойной точности Mersenne Twister, и я хотел понять пару основных вещей, прежде чем двигаться дальше.О генерации случайных чисел dSFMT на C++
я составил и запустить тест предоставленный официальных файлов dSFMT и это лучший результат для моей системы:
C:\TDM-GCC-64\C++ Tests\dSFMT>test-sse2-M19937 -s
consumed time for generating 100000000 randoms.
ST BLOCK [0, 1) AVE: 115ms.
ST BLOCK (0, 1] AVE: 108ms.
ST BLOCK (0, 1) AVE: 106ms.
ST BLOCK [1, 2) AVE: 77ms.
ST SEQ [0, 1) 1 AVE: 174ms.
ST SEQ [0, 1) 2 AVE: 207ms.
total = 500014655.815776
ST SEQ (0, 1] 1 AVE: 173ms.
ST SEQ (0, 1] 2 AVE: 205ms.
total = 500035344.184224
ST SEQ (0, 1) 1 AVE: 209ms.
ST SEQ (0, 1) 2 AVE: 247ms.
total = 500014655.815776
ST SEQ [1, 2) 1 AVE: 173ms.
ST SEQ [1, 2) 2 AVE: 204ms.
total = 1500064655.815183
Мои вопросы:
- Почему генерации [1,2) быстрее, чем [0,1]?
- Почему генерация блоков быстрее, чем последовательная? Не следует ли выделять большой массив и удалить его и переписать на него медленнее?
- Если мне нужно сгенерировать цифры 1e12, какая была бы лучшая стратегия? Если вы делаете это в блоках, каков оптимальный размер массива?
Возможно, вы захотите ознакомиться с http://www.pcg-random.org/ - будет намного быстрее, чем MT, с аналогичными функциями блока. –
Спасибо за ссылку. Я попробовал шаги, предложенные на www.pcg-random.org/using-pcg-c.html, но по какой-то причине не быстрее, чем dSFMT для генерации поплавков. Мне, наверное, нужно еще кое-что прочитать, но предварительные тесты показывают разницу по порядку величины. – Esteban
Действительно ?! Это сюрприз для меня. –