Как генерировать случайные числа в C ++, используя элементы заголовка <random>? - PullRequest
4 голосов
/ 14 сентября 2010

Я научился программировать на C # и начал изучать C ++. Я использую Visual Studio 2010 IDE. Я пытаюсь сгенерировать случайные числа с помощью классов распределения, доступных в <random>. Например, я попытался сделать следующее:

    #include <random>
std::normal_distribution<double> *normal = new normal_distribution<double>(0.0, 0.0);
std::knuth_b *engine = new knuth_b();
std::variate_generator<knuth_b, normal_distribution<double>> *rnd;  
rnd = new variate_generator<knuth_b, normal_distribution<double>>(engine, normal);

Последняя строка выдает ошибку компилятора: IntelliSense: экземпляр экземпляра "std :: tr1 :: variate_generator <_Engine, _Distrib> :: variate_generator [с _Engine = std :: tr1 :: knuth_b, _Distrib = std :: tr1 :: normal_distribution]" не соответствует списку аргументов

Мои аргументы выглядят хорошо для меня, что я делаю не так? Когда создается экземпляр класса variate_generator, какой метод вы вызываете для получения следующего случайного числа, т.е. System.Random.Next () .NET?) *

Ответы [ 2 ]

4 голосов
/ 14 сентября 2010

В C ++ 0x нет variate_generator, но std :: bind работает так же хорошо. Следующие компиляции и запуска в GCC 4.5.2 и MSVC 2010 Express:

#include <random>
#include <functional>
#include <iostream>
int main()
{
    std::normal_distribution<> normal(10.0, 3.0); // mean 10, sigma 3
    std::random_device rd;
    std::mt19937 engine(rd()); // knuth_b fails in MSVC2010, but compiles in GCC
    std::function<double()> rnd = std::bind(normal, engine);

    std::cout << rnd() << '\n';
    std::cout << rnd() << '\n';
    std::cout << rnd() << '\n';
    std::cout << rnd() << '\n';
}

PS: избегайте new, когда можете.

2 голосов
/ 08 марта 2011

ALERT: обратите внимание, что приведенное выше решение связывает копию двигателя, а не ссылку на двигатель.Таким образом, если вы также делаете: std :: function rnd2 = std :: bind (normal, engine);тогда объект rnd и объект rnd2 будут производить точно такую ​​же последовательность случайных чисел.

...