Типы генераторов случайных чисел и функции, которые принимают их в качестве аргументов

После выступления Стефана Т. Лававея (см. Вот), Я использую генератор случайных чисел Мерсенна Твистера и создаю случайные числа с таким кодом

#include <iostream>
#include <random>
int main()
{
std::mt19937 mt(132);
std::uniform_int_distribution<int> dist(0,50);
for (int i =0;i<10;i++)
{
std::cout << dist(mt) << std::endl;
}
}

Я хотел бы перемешать, используя shuffle функция (а не random_shuffle) функция (как рекомендовано в разговоре еще раз). От cppreference.com, Я вижу, что функция принимает URBG&& в качестве аргумента.

Я не очень понимаю, что URBG является. Я пытался накормить mt19937 вместо этого и, кажется, работает нормально.

#include <iostream>
#include <random>
int main()
{
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);

std::mt19937 mt(132);

std::shuffle(v.begin(),v.end(),mt);
for (int i=0;i<v.size();i++)
{
std::cout << v[i] << std::endl;
}
}

Вопрос

  • Что такое URBG? Является mt19937 подкласс URBG?
  • Могут ли все типы генераторов случайных чисел, заданных в качестве аргумента любой функции, привести к стохастическому результату (например, rand, shuffle или любая функция из random.h)?

-1

Решение

URBG имя аргумента шаблона; это может быть выведено для различных типов, в том числе std::mt19937, Если вы посмотрите дальше на страницы cppreference, вы увидите:

гUniformRandomBitGenerator чей тип результата можно преобразовать в std :: iterator_traits :: diff_type

Так URBG может быть любого типа, такого что:

  • URBG::result_type целочисленный тип без знака
  • URBG::min() возвращает наименьшее URBG::result_type тот operator() может вернуться (строго меньше, чем макс)
  • URBG::max() возвращает самый большой URBG::result_type тот operator() может вернуться (строго больше, чем мин)
  • URBG::operator() (применяется к предоставленному экземпляру) возвращает в амортизированном постоянном времени значение в закрытом интервале [URBG::min(), URBG::max()]
  • URBG::result_type конвертируется в std::iterator_traits<RandomIt>::difference_type

Новые генераторы случайных чисел обычно имеют некоторую форму состояния, но если библиотечная функция может принять это каким-либо образом (например, принимая объект генератора случайных чисел, как это делает std :: shuffle), то, конечно, их можно использовать.

2

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

URBG — это генератор случайных битов. На языке C ++ это функциональный объект, возвращающий целочисленные значения без знака с равномерным распределением вероятности (то есть каждый возможный результат с одинаковой вероятностью будет иметь место, как и любой другой). Эти требования, конечно, строго определены в стандарте.

std::mt19937 экземпляры являются URBG, потому что они удовлетворяют этому определению. std::uniform_int_distribution экземпляры также удовлетворяют этому, так что в этом случае нет абсолютно никакой разницы между передачей одного или другого <random> функции.

Однако обратите внимание, что большинство распределений, определенных в <random> являются не единообразно по дизайну, поэтому их нельзя использовать там, где ожидается URBG (вы получите искаженные результаты).

2

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