В настоящее время я использую версию генератора случайных чисел Зиггурата Джорджа Марсалья. Хотя это, предположительно, один из самых быстрых способов генерации нормально распределенных генераторов случайных чисел, он заполнен кодом управления контуром (т. Е. Операторы возврата в середине цикла, if-statements, branch и т. Д.), И это делает несколько вызовов стандартных функций C, таких как exp() и log(). Не говоря уже о бесконечном цикле.Конвейерная обработка генератора случайных чисел Зиггурата
Это делает код, который не может быть конвейеризован компилятором. В конечном счете, я чувствую, что базовый подход, например, использование центральной предельной теоремы напрямую, в конечном счете может быть быстрее, поскольку он может быть легко конвейерным. К сожалению, он не подходит для хвостов распределения Гаусса, и поэтому он неприемлем для моего приложения.
Есть ли у кого-нибудь идеи о том, как можно сократить код управления и вызовы функций. В настоящее время я использую Colin Green's implementation of the algorithm, который я портировал на C. Мой базовый унифицированный генератор - Tiny Mersenne Twister (так что, пожалуйста, не говорите мне, чтобы использовать MT, как я видел, другие люди, я уже здесь. для нормально распределенных RNG, неравномерных RNG).
- это алгоритм, зависящий от того, что базовый RNG является 64-разрядным? Я изменил реализацию Colin Green, так что для экономии памяти использует float, а не doubles, поскольку я программирую для встроенного приложения. – audiFanatic
Ну, он получает 64 бит за раз из RNG, используя 52 для мантиссы двойника и 7 для индексации таблицы (в соответствии с улучшением Doonik), но нет причин, по которым вы не можете просто вызвать 32-битный RNG два раза. –
Правда, я мог бы. Но опять же, мой RNG, в конечном счете, будет возвращать поплавки, а не удваивается. Поэтому мне нечего делать 64-битную только для того, чтобы вернуть 32-битное число. – audiFanatic