Генерация случайных чисел с использованием C++11 случайных библиотеке

Как и предполагает название, я пытаюсь выяснить способ генерации случайных чисел с использованием нового C++11 в <случайных> библиотека. Я пробовал с этим кодом:

std::default_random_engine generator;
std::uniform_real_distribution<double> uniform_distance(1, 10.001);

Проблема с кодом у меня заключается в том, что каждый раз, когда я скомпилировать и запустить его, он всегда генерирует одинаковые числа. Так что мой вопрос, какие другие функции в случайной библиотека может сделать это, будучи действительно случайные?

Для моего конкретного случая использования, я пытался получить значение в пределах диапазона [1, 10]

Комментарии к вопросу (8)
Решение

Т. Lavavej Стефан (стл) от Microsoft не говорить на родных о том, как использовать новый C++11 случайных функций и почему бы не использовать функции RAND()`. В нем он включен слайд, который в основном решает ваш вопрос. Я'вэ скопировал код из этого слайд ниже.

Здесь вы можете увидеть полный разговор: http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful


#include 
#include 

int main() {
    std::random_device rd;
    std::mt19937 mt(rd());
    std::uniform_real_distribution dist(1.0, 10.0);

    for (int i=0; i
Комментарии (9)

Мой 'случайных' библиотека обеспечивают высокий удобный враппер на C++11 случайных классов. Вы можете делать почти все с простого 'вам' метод.

Примеры:

  1. Случайных чисел в диапазоне

авто Валь = случайный::получить(-10, 10); // целое число авто Вэл = случайный::сделать(10.Ф -10.Ф); // плавающей точкой

  1. Случайных булевых

авто Валь = случайный::получить в<типа bool и GT;( ) // 50% для создания истинного авто Валь = случайный::получить в<типа bool и GT;( 0.7 ) // 70%, чтобы создать настоящий

  1. Случайное значение из СТД::initilizer_list

авто Валь = случайный::вам( { 1, 3, 5, 7, 9 } ); // Валь = 1 или 3 или...

  1. Случайная итератор итератор из диапазона или весь контейнер

авто это = случайный::получить( ВМК.начать(), ВМК.конец() ); // это = произвольный итератор авто это = случайный::получить( ВМК ); // возвращает итератор произвольного

И еще больше вещей ! Проверьте страницу GitHub:

https://github.com/effolkronium/random

Комментарии (2)

Здесь's что-то, что я написал в этом духе::

#include 
#include 
#include 

using namespace std;

//==============================================================
// RANDOM BACKOFF TIME
//==============================================================
class backoff_time_t {
  public:
    random_device                      rd;
    mt19937                            mt;
    uniform_real_distribution  dist;

    backoff_time_t() : rd{}, mt{rd()}, dist{0.5, 1.5} {}

    double rand() {
      return dist(mt);
    }
};

thread_local backoff_time_t backoff_time;

int main(int argc, char** argv) {
   double x1 = backoff_time.rand();
   double x2 = backoff_time.rand();
   double x3 = backoff_time.rand();
   double x4 = backoff_time.rand();
   return 0;
}

~

Комментарии (0)

Здесь какая-ресурсе вы можете узнать о псевдо-генератор случайных чисел.

https://en.wikipedia.org/wiki/Pseudorandom_number_generator

В основном, случайные числа в компьютере нужен семени (это число может быть текущее системное время).

Заменить

std::default_random_engine generator;

По

std::default_random_engine generator();
Комментарии (0)

Вы've получили две типичные ситуации. Первый заключается в том, что вы хотите случайных чисел и разве'т слишком беспокоились за качество и скорость исполнения. В этом случае используйте следующий макрос

#define uniform() (rand()/(RAND_MAX + 1.0))

что дает вам P в диапазоне от 0 до 1 - Эпсилон (если RAND_MAX больше, чем точность, но не беспокоиться о том, что когда вы приходите к ней).

инт х = (тип int) (единые() * Н);

Теперь выдает случайное целое число от 0 до n -1.

Если вам нужны другие дистрибутивы, вы должны превратить стр. Или иногда это'ы легче назвать равномерным() несколько раз.

Если вы хотите, повторяющееся поведение, семя с постоянным, иначе семена с вызовом времени().

Теперь, если вы беспокоитесь о качестве или запустить сроков выполнения работ, переписать форму(). А в остальном Дон'т прикоснуться к код. Всегда держать равномерную() от 0 до 1 минус Эпсилон. Теперь вы можете обернуть библиотеки C++ случайные числа, чтобы создать лучшую форму(), но, что'какой-то вариант среднего уровня. Если вы не побеспокоились об особенностях ГСЧ, то это's также стоит инвестировать немного времени, чтобы понять, как базовые методы работы, потом предоставляем один. Так что вы've получили полный контроль над кодом, и вы можете гарантировать, что с таким же семян, последовательность всегда одна и та же, независимо от платформы или версии языка C++ вы ссылаетесь.

Комментарии (2)