Я вижу, что std :: shuffle принимает аргумент URNG.
Я использую пользовательскую версию генератора (WELL512a) и хотел бы использовать ее с std :: shuffle.
Мой вопрос: возможно ли использовать его с std :: shuffle?
Например, может быть, используя URNG в качестве базового класса?
Спасибо!
URNG
это имя параметра шаблона — это не определенный тип. Вам нужно реализовать объект, который соответствует определенным требованиям, затем вы можете передать его std::shuffle
, Что-то вроде этого:
class MyRNG {
public:
typedef size_t result_type;
static size_t min() { return 0; }
static size_t max() { return 42; }
size_t operator()() {
// generate a random number in the range [0, 42]
}
};
std::shuffle(someVector.begin(), someVector.end(), MyRNG());
Вы также можете рассмотреть возможность использования std::random_shuffle
вместо. Тот берет объект r
который можно назвать r(n)
для некоторого целого числа n
и произвести случайное число в диапазоне [0, n)
,
Замечания: std::random_shuffle
устарела в C ++ 14.
Мы можем видеть из документации по cppreference на станд :: перетасовка тот:
URNG должен соответствовать требованиям UniformRandomNumberGenerator.
к сожалению, сайт не документирует эти требования, поэтому нам нужно перейти к черновому стандартному разделу C ++ 11 26.5.1.3
Единые требования к генератору случайных чисел что говорит следующее:
Равномерный генератор случайных чисел g типа G является функциональным объектом
возвращая целочисленные значения без знака, так что каждое значение в диапазоне
возможные результаты имеют (в идеале) равную вероятность быть возвращеннымиКласс G удовлетворяет требованиям равномерного генератора случайных чисел, если
выражения, приведенные в таблице 116, являются действительными и имеют указанные
семантика, и если G также удовлетворяет всем другим требованиям этого
раздел 26.5.1.3. В этой таблице и в этом разделе:
- Это
тип, названный ассоциированным с G типом результата G, и- г является значением
Таблица 116
резюмируется следующим образом:
Должно иметь место следующее соотношение: G :: min () < G :: макс ().
Обновить
Чтобы уточнить, когда это говорит T — целое число без знака это означает один из следующих типов, описанных в разделе 3.9.1
Основные типы который включает в себя:
Это также включает расширенное целое число без знака такие типы, как uinit64_t, если ваша платформа поддерживает их.