После выступления Стефана Т. Лававея (см. Вот), Я использую генератор случайных чисел Мерсенна Твистера и создаю случайные числа с таким кодом
#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
)?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), то, конечно, их можно использовать.
URBG — это генератор случайных битов. На языке C ++ это функциональный объект, возвращающий целочисленные значения без знака с равномерным распределением вероятности (то есть каждый возможный результат с одинаковой вероятностью будет иметь место, как и любой другой). Эти требования, конечно, строго определены в стандарте.
std::mt19937
экземпляры являются URBG, потому что они удовлетворяют этому определению. std::uniform_int_distribution
экземпляры также удовлетворяют этому, так что в этом случае нет абсолютно никакой разницы между передачей одного или другого <random>
функции.
Однако обратите внимание, что большинство распределений, определенных в <random>
являются не единообразно по дизайну, поэтому их нельзя использовать там, где ожидается URBG (вы получите искаженные результаты).