Используя std :: shuffle с пользовательским rng?

Я вижу, что std :: shuffle принимает аргумент URNG.
Я использую пользовательскую версию генератора (WELL512a) и хотел бы использовать ее с std :: shuffle.

Мой вопрос: возможно ли использовать его с std :: shuffle?
Например, может быть, используя URNG в качестве базового класса?

Спасибо!

2

Решение

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.

3

Другие решения

Мы можем видеть из документации по cppreference на станд :: перетасовка тот:

URNG должен соответствовать требованиям UniformRandomNumberGenerator.

к сожалению, сайт не документирует эти требования, поэтому нам нужно перейти к черновому стандартному разделу C ++ 11 26.5.1.3 Единые требования к генератору случайных чисел что говорит следующее:

  1. Равномерный генератор случайных чисел g типа G является функциональным объектом
    возвращая целочисленные значения без знака, так что каждое значение в диапазоне
    возможные результаты имеют (в идеале) равную вероятность быть возвращенными

  2. Класс G удовлетворяет требованиям равномерного генератора случайных чисел, если
    выражения, приведенные в таблице 116, являются действительными и имеют указанные
    семантика, и если G также удовлетворяет всем другим требованиям этого
    раздел 26.5.1.3. В этой таблице и в этом разделе:

    • Это
      тип, названный ассоциированным с G типом результата G, и
    • г является значением

Таблица 116 резюмируется следующим образом:

  • G :: result_type
    • тип возвращаемого значения T
    • T — целое число без знака
  • г()
    • тип возврата T
    • Возвращает значение в закрытом интервале [G :: min (), G :: max ()].
  • G :: мин ()
    • тип возврата T
    • Обозначает наименьшее значение, потенциально возвращаемое оператором ().
  • G :: макс ()
    • тип возврата T
    • Обозначает наибольшее значение, потенциально возвращаемое оператором ().

Должно иметь место следующее соотношение: G :: min () < G :: макс ().

Обновить

Чтобы уточнить, когда это говорит T — целое число без знака это означает один из следующих типов, описанных в разделе 3.9.1 Основные типы который включает в себя:

  • символ без знака
  • беззнаковый короткий int
  • без знака int
  • без знака длинный int
  • без знака long long int

Это также включает расширенное целое число без знака такие типы, как uinit64_t, если ваша платформа поддерживает их.

5

По вопросам рекламы [email protected]