Как включить максимальное значениеiform_real_distribution - PullRequest
0 голосов
/ 30 апреля 2018

Я новичок в C ++ и пытаюсь изучить возможности C ++ 11. Здесь я пытаюсь познакомиться с новыми двигателями, генерирующими случайность.

Я обобщил следующий код из учебника по этой теме и заметил две вещи:

1- uniform_real_distribution не включает максимальное значение.
2- Закомментированная строка выдает ошибку, хотя, кажется, она отлично работает в учебнике.

#include <iostream>
#include <random>
#include <chrono>
#include <string>  

using namespace std;

int main(){
    unsigned seed = 201;
    //seed = chrono::steady_clock()::now().time_since_epoch().count();
    default_random_engine e(seed);
    uniform_real_distribution<double> u(0,9);
    vector<double> v(10);
    int num;
    for(int i = 0; i < 400; ++i){
        num = u(e);
        ++v[num];
    }
    for (int i = 0; i < 10; ++i)
        cout << i << ":  " << string(v[i],'*') << "\n";
}

Я безуспешно пытался найти причины этих двух вещей.

Итак, мои вопросы:

1- Как включить максимальное значение?
2- Почему я получаю сообщение об ошибке, когда раскомментирую строку chrono?

cannot convert 'std::chrono::_V2::steady_clock' to 'unsigned int' in initialization

Примечание: я использую MinGW64 g ++ с c ++ 14.

1 Ответ

0 голосов
/ 30 апреля 2018
  1. Как уже сказал Крис Дрю, вы можете использовать nextafter в качестве второго параметра uniform_real_distribution.
  2. Обратите внимание, что вы сначала создаете новый объект chrono::steady_clockchrono::steady_clock()), а затем пытаетесь вызвать статический член now() из этого объекта.

Поскольку now() является статической функцией-членом chrono::steady_clock, вы можете (и должны) напрямую вызывать chrono::steady_clock::now().

Финальный код:

#include <iostream>
#include <random>
#include <chrono>
#include <string>  

using namespace std;

int main(){
    unsigned seed = 201;
    seed = chrono::steady_clock::now().time_since_epoch().count();
    default_random_engine e(seed);
    uniform_real_distribution<double> u(0,std::nextafter(9, std::numeric_limits<double>::max()));
    vector<double> v(10);
    int num;
    for(int i = 0; i < 400; ++i){
        num = u(e);
        ++v[num];
    }
    for (int i = 0; i < 10; ++i)
        cout << i << ":  " << string(v[i],'*') << "\n";
}
...