2016-10-16 17 views
-1

результатом беседы Стефана Т. Lavavej (см here), я с помощью генератора случайных чисел Мерсенна Twister и я продуцирующие случайных чисел с такого рода кодомТипы генераторов случайных чисел и функций, которые принимают их в качестве аргументов

#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)?
+0

Если вы посмотрите на ссылку, с которой вы ссылаетесь, вы увидите, что 'URBG' является аргументом шаблона. Тип - это все, что соответствует интерфейсу, например. класс 'std :: mt19937'. Дополнительную информацию см. В разделе «Требования к типу» ссылки. –

ответ

2

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

г - это UniformRandomBitGenerator чей тип результата конвертируется в StD :: iterator_traits :: difference_type

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

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

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

2

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

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

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