Стандартная библиотека C ++ 11 содержит приличную платформу и пару исправных генераторов, которых вполне достаточно для домашних заданий и использования в неформальной манере.
Однако для кода производственного уровня вы должны точно знать, каковы конкретные свойства различных генераторов, прежде чем использовать их, поскольку все они имеют свои предостережения. Кроме того, ни один из них не проходит стандартные тесты для PRNG, таких как TestU01, за исключением генераторов ranlux, если они используются с большим коэффициентом роскоши.
Если вы хотите получить четкие, повторяемые результаты, тогда вам нужен собственный генератор.
Если вам нужна мобильность, вам нужно взять с собой собственный генератор.
Если вы можете жить с ограниченной переносимостью, тогда вы можете использовать boost или C ++ 11 вместе с вашим собственным генератором (ами).
Более подробную информацию - включая код для простого, но быстрого генератора отличного качества и обильные ссылки - можно найти в моих ответах на похожие темы:
Для профессиональных равномерных отклонений с плавающей точкой необходимо рассмотреть еще две проблемы:
- открытие против полуоткрытого или закрытого диапазона, т.е. (0,1), [0, 1) или [0,1]
- метод преобразования из целого в число с плавающей точкой (точность, скорость)
Обе являются фактически двумя сторонами одной медали, так как метод преобразования учитывает включение / исключение 0 и 1. Вот три различных метода для полуоткрытого интервала:
// exact values computed with bc
#define POW2_M32 2.3283064365386962890625e-010
#define POW2_M64 5.421010862427522170037264004349e-020
double random_double_a ()
{
double lo = random_uint32() * POW2_M64;
return lo + random_uint32() * POW2_M32;
}
double random_double_b ()
{
return random_uint64() * POW2_M64;
}
double random_double_c ()
{
return int64_t(random_uint64()) * POW2_M64 + 0.5;
}
(random_uint32()
и random_uint64()
являются заполнителями для ваших реальных функций и обычно передаются в качестве параметров шаблона)
Метод a демонстрирует, как создать равномерное отклонение, которое не смещается из-за избыточной точности для более низких значений; код для 64-битного кода не показан, потому что он проще и включает в себя маскирование 11 битов. Распределение является равномерным для всех функций, но без этого трюка было бы больше различных значений в области ближе к 0, чем где-либо еще (более мелкий интервал сетки из-за изменяющегося ulp).
Метод c показывает, как получить унифицированное отклонение быстрее на некоторых популярных платформах, где FPU знает только 64-битный целочисленный тип со знаком. Чаще всего вы видите метод b , но там компилятор должен генерировать много дополнительного кода под капотом, чтобы сохранить семантику без знака.
Смешайте и сопоставьте эти принципы, чтобы создать собственное решение.
Все это объясняется в превосходной статье Юргена Доорника Преобразование случайных чисел высокого периода в число с плавающей точкой .