类中的随机数生成器函数

时间:2015-11-14 17:27:09

标签: c++ random

你好我正在尝试创建一个函数,它会给我一个随机数,然后将它作为一个受保护的int返回给我的类,这将被继承。 我想要的是创建一个随机数(0,1),然后将其传递给继承的类GBM。在那个课程中,我需要将它用于蒙特卡罗模拟。如何创建将继承的随机数?

头文件

#pragma once

#include <iostream>
#include <random>
#include <chrono>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::default_random_engine;
using std::normal_distribution;
using std::vector;


class option
{
private:
    float mean_ = 0.0;
    float std_ = 1.0;

protected:
    float rnum;
    void RANDOM();

public:
    option();
    virtual float get_rnum() = 0;
    virtual void simulation() = 0;
    virtual ~option() {};
};

class GBM : public option
{
public:
    GBM();
    virtual float get_rnum();
    virtual void simulation();
    virtual ~GBM () {}
};

cpp文件

#include "Option.h"
void option::RANDOM()
{
    const int N = 500000;
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    std::default_random_engine generator(seed);
    std::normal_distribution<float> RAND(mean_, std_);

    for (int i = 0; i <= N; i++)
    {
        rnum = RAND(generator);
    }
}


option::option()
{
}

GBM::GBM()
{
}

float GBM::get_rnum()
{
    float k;
    k = rnum;

    return (k);
}

2 个答案:

答案 0 :(得分:0)

随机数生成器长时间存在时效果最佳。但是,您的RANDOM()方法每次调用时都会创建,播种和使用新的RNG。

如果您希望option对象作为RNG替代,请创建实际的RNG并在构造函数中将其播种,只需一次,然后从中提取一个随机数使用你的RANDOM()方法。

请记住,创建一次RNG。当你创建它时,它一次种子。确保它存在很长时间。顺便说一句,你还应该discard()至少有一千个数字来加热它。

无关联,ALL_CAPS告诉C和C ++人你正在使用MACRO - 但实际上你并不是。

希望这有帮助。

答案 1 :(得分:0)

这样的事情:

  void option::RANDOM()
{
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    static std::mt19937 generator(seed);
    std::normal_distribution<float> RAND(mean_, std_);
    rnum = RAND(generator);

}


option::option()
{
    float rnum;
}